Cách sử dụng npm với ASP.NET Core


117

Tôi đang sử dụng npm để quản lý jQuery, Bootstrap, Font Awesome và các thư viện khách tương tự mà tôi cần cho ứng dụng ASP.NET Core của mình.

Cách tiếp cận phù hợp với tôi bắt đầu bằng cách thêm tệp package.json vào dự án, trông giống như sau:

{
    "version": "1.0.0",
    "name": "myapp",
    "private": true,
    "devDependencies": {
  },
  "dependencies": {
    "bootstrap": "^3.3.6",
    "font-awesome": "^4.6.1",
    "jquery": "^2.2.3"
  }
}

npm khôi phục các gói này vào thư mục node_modules ở cùng cấp với wwwroot trong thư mục dự án:

nhập mô tả hình ảnh ở đây

Vì ASP.NET Core phục vụ các tệp tĩnh từ thư mục wwwroot và node_modules không có ở đó, tôi đã phải thực hiện một vài thay đổi để thực hiện việc này, thay đổi đầu tiên: thêm app.UseFileServer ngay trước app.UseStaticFiles trong Khởi động của tôi. tệp cs:

app.UseFileServer(new FileServerOptions()
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")), 
    RequestPath = new PathString("/node_modules"),
    EnableDirectoryBrowsing = true
});

app.UseStaticFiles();

và cái thứ hai, bao gồm node_modules trong PublishingOptions của tôi trong tệp project.json:

"publishOptions": {
  "include": [
    "web.config",
    "wwwroot",
    "Views",
    "node_modules"
  ]
},

Điều này hoạt động trong môi trường phát triển của tôi và nó cũng hoạt động khi tôi triển khai nó cho phiên bản Azure App Service của mình, các tệp tĩnh jquery, bootstrap và font-awesome được phục vụ tốt, nhưng tôi không chắc về việc triển khai này.

Cách tiếp cận phù hợp để làm điều này là gì?

Giải pháp này được đưa ra sau khi thu thập rất nhiều bit thông tin từ một số nguồn và thử một số nguồn không hoạt động và có vẻ hơi kỳ lạ khi phải cung cấp các tệp này từ bên ngoài wwwroot.

Bất kỳ lời khuyên sẽ được đánh giá rất cao.



Liên kết này có một ví dụ làm việc trên ASP.NET Lõi w / NPM : ievangelistblog.wordpress.com/2016/01/13/...
David Pine

2
Một điều xảy ra với tôi là sử dụng Bundler and Minifier- Chỉ định nguồn là Bên ngoài wwwroot và khi bạn xây dựng nó sẽ xây dựng JS vào wwwroot. Đó là nội dung được con đường đúng đắn .. Bạn không nên phục vụ từ node_modules
Piotr Kula

Tôi thực sự không khuyến khích bất cứ ai phục vụ tĩnh node_modulesthư mục. a) đó không phải là cách hệ thống sinh thái được thiết kế b) đó là một rủi ro bảo mật, một trong các gói đã cài đặt của bạn có thể làm rò rỉ thông tin nhạy cảm. Cách thích hợp là thiết lập một đường dẫn xây dựng (grunt / gulp / node / webpack) xuất bản các tệp vào một srchoặc whateverthư mục dành riêng để phục vụ các tệp front-end tĩnh
CervEd

Câu trả lời:


45

Bằng cách xuất bản toàn bộ node_modulesthư mục của bạn, bạn đang triển khai nhiều tệp hơn bạn thực sự cần trong sản xuất.

Thay vào đó, hãy sử dụng trình chạy tác vụ như một phần của quá trình xây dựng của bạn để đóng gói các tệp bạn yêu cầu và triển khai chúng vào wwwrootthư mục của bạn . Điều này cũng sẽ cho phép bạn kết hợp và giảm thiểu nội dung của mình cùng một lúc, thay vì phải phục vụ từng thư viện riêng lẻ.

Sau đó, bạn cũng có thể loại bỏ hoàn toàn FileServercấu hình và UseStaticFilesthay vào đó dựa vào .

Hiện tại, gulp là người chạy nhiệm vụ VS được lựa chọn. Thêm một gulpfile.jsvào thư mục gốc của dự án của bạn và định cấu hình nó để xử lý các tệp tĩnh của bạn khi xuất bản.

Ví dụ: bạn có thể thêm phần sau scriptsvào project.json:

 "scripts": {
    "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
  },

Cái nào sẽ hoạt động với gulpfile sau (mặc định khi giàn giáo với yo):

/// <binding Clean='clean'/>
"use strict";

var gulp = require("gulp"),
    rimraf = require("rimraf"),
    concat = require("gulp-concat"),
    cssmin = require("gulp-cssmin"),
    uglify = require("gulp-uglify");

var webroot = "./wwwroot/";

var paths = {
    js: webroot + "js/**/*.js",
    minJs: webroot + "js/**/*.min.js",
    css: webroot + "css/**/*.css",
    minCss: webroot + "css/**/*.min.css",
    concatJsDest: webroot + "js/site.min.js",
    concatCssDest: webroot + "css/site.min.css"
};

gulp.task("clean:js", function (cb) {
    rimraf(paths.concatJsDest, cb);
});

gulp.task("clean:css", function (cb) {
    rimraf(paths.concatCssDest, cb);
});

gulp.task("clean", ["clean:js", "clean:css"]);

gulp.task("min:js", function () {
    return gulp.src([paths.js, "!" + paths.minJs], { base: "." })
        .pipe(concat(paths.concatJsDest))
        .pipe(uglify())
        .pipe(gulp.dest("."));
});

gulp.task("min:css", function () {
    return gulp.src([paths.css, "!" + paths.minCss])
        .pipe(concat(paths.concatCssDest))
        .pipe(cssmin())
        .pipe(gulp.dest("."));
});

gulp.task("min", ["min:js", "min:css"]);

36
Tôi hơi bối rối không biết đây là câu trả lời cho câu hỏi như thế nào. Đây gần như là chính xác những gì Microsoft có để định cấu hình Gulp tại đây ( docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp ). Tuy nhiên, theo như tôi có thể nói rằng điều này không lấy nội dung từ thư mục node_modules của tôi và thêm nó vào 'lib' hoặc làm cho nó có thể sử dụng được trong bất kỳ tệp nào của tôi ... Tôi rất mới với điều này nên vô cùng bối rối bởi dường như vô cùng thế giới phát triển web phức tạp mới ...
Gerard Wilkinson

32
Phức tạp được rồi. Tôi đã sẵn sàng từ bỏ giao diện người dùng hoàn toàn và chỉ làm việc trên các API.
Luke Puplett,

12
Nói chung, đây là cách tiếp cận đúng, nhưng câu trả lời để lại một bước quan trọng: sao chép các tệp từ thư mục node_modules vào thư mục wwwroot như một tác vụ Gulp. Bắt đầu với var nodeRoot = './node_modules/'; và thêm một tác vụ sao chép thư mục con mong muốn từ nodeRoot vào thư mục con thích hợp của webroot. Bây giờ không có thời gian để nói rõ hơn, nhưng nếu có hứng thú, tôi có thể bổ sung chi tiết sau.
Doug

32
Tại sao không ai nêu ra điều hiển nhiên: "Tại sao chúng ta phải hỏi câu hỏi này!" Tại sao chúng ta cố tình cài đặt các tệp ở một vị trí mà chúng không thể được sử dụng? Sau đó, vì các tệp của chúng tôi không thể truy cập được, chúng tôi cài đặt và định cấu hình một tiện ích phức tạp để sao chép chúng vào một vị trí có thể sử dụng chúng. Nó thực sự vô lý.
Sam

8
Bởi vì công cụ ở đây về cơ bản là tào lao. Sử dụng npm chỉ là sử dụng npm, giống như bạn làm cho bất cứ điều gì . Không có gì cụ thể cho ASP.NET Core. Mọi thứ đi vào node_modulesvì đó là những gì npm làm. Nhiệm vụ gulp là cần thiết để di chuyển mọi thứ vào đúng nơi, tức là nơi bạn thực sự cần chúng. Tôi nghĩ vấn đề là Microsoft đã cung cấp một tích hợp tuyệt vời như vậy với Bower, nhưng bây giờ Bower đã chết (hoặc ít nhất là chết) và Microsoft chưa cung cấp bất kỳ công cụ thay thế nào.
Chris Pratt

41

nhập mô tả hình ảnh ở đây

  • Sử dụng npmđể quản lý các thư viện phía máy khách là một lựa chọn tốt (trái ngược với Bower hoặc NuGet), bạn đang nghĩ đúng hướng :)
  • Chia các dự án phía máy chủ (ASP.NET Core) và phía máy khách (ví dụ: Angular 2, Ember, React) thành các thư mục riêng biệt (nếu không, dự án ASP.NET của bạn có thể có nhiều nhiễu - kiểm tra đơn vị cho mã phía máy khách, node_modules thư mục, xây dựng đồ tạo tác, v.v.). Các nhà phát triển front-end làm việc trong cùng một nhóm với bạn sẽ cảm ơn bạn vì điều đó :)
  • Khôi phục các mô-đun npm ở cấp giải pháp (tương tự như cách bạn khôi phục các gói qua NuGet - không phải vào thư mục của dự án), bằng cách này, bạn có thể có các bài kiểm tra đơn vị và tích hợp trong một thư mục riêng biệt (trái ngược với việc kiểm tra JavaScript phía máy khách bên trong Dự án ASP.NET Core).
  • Việc sử dụng có thể không cần FileServer, chỉ StaticFilescần có là đủ để cung cấp các tệp tĩnh (.js, hình ảnh, v.v.)
  • Sử dụng Webpack để nhóm mã phía máy khách của bạn thành một hoặc nhiều phần (gói)
  • Bạn có thể không cần Gulp / Grunt nếu đang sử dụng gói mô-đun như Webpack
  • Viết các tập lệnh tự động hóa xây dựng bằng ES2015 + JavaScript (trái ngược với Bash hoặc PowerShell), chúng sẽ hoạt động trên nhiều nền tảng và dễ tiếp cận hơn với nhiều nhà phát triển web (ngày nay mọi người đều nói JavaScript)
  • Đổi tên wwwrootthành public, nếu không, cấu trúc thư mục trong Azure Web Apps sẽ khó hiểu ( D:\Home\site\wwwroot\wwwrootvs D:\Home\site\wwwroot\public)
  • Chỉ xuất bản đầu ra đã biên dịch lên Ứng dụng web Azure (bạn không bao giờ được đẩy node_moduleslên máy chủ lưu trữ web). Xem tools/deploy.jsnhư một ví dụ.

Truy cập ASP.NET Core Starter Kit trên GitHub (tuyên bố từ chối trách nhiệm: Tôi là tác giả)


2
Câu trả lời tuyệt vời, kudo cho công việc của bạn trong việc cung cấp cho cộng đồng bộ công cụ khởi động!
David Pine

7
Tôi đã xây dựng thành công một ứng dụng Angular công khai khổng lồ cho một thương hiệu lớn của Vương quốc Anh vào đầu năm nay, nhưng tôi thậm chí không thể hiểu hầu hết câu trả lời này. Tôi thậm chí không thể bắt đầu học nó ở khắp mọi nơi. Nghĩa đen là gặp khủng hoảng nghề nghiệp.
Luke Puplett,

đây là một bản tóm tắt tốt về Những việc nên làm và Không nên trong khi viết và quản lý các tập lệnh và tệp phía máy khách. Tiết kiệm thời gian và nghiên cứu của tôi. Kudos cho bạn!
Sangeeta

Thật không may, Visual Studio (ngu ngốc là IMHO) xử lý thư mục "wwwroot" một cách đặc biệt, chỉ dựa trên tên của nó, tạo cho nó một biểu tượng "gốc web" đặc biệt trong trình khám phá giải pháp và đánh dấu nội dung của nó là "Không có" theo mặc định thay vì "Nội dung" . Nếu mục đích là đặt các tệp được phân phối tĩnh vào đó và bạn đang sử dụng Visual Studio, có lẽ bạn nên để tên là "wwwroot". Tôi đồng ý rằng đó là một cái tên xấu.
Jez

27

Cài đặt Gói và Trình thu nhỏ vào Tiện ích mở rộng Visual Studio

Sau đó, bạn tạo một bundleconfig.jsonvà nhập như sau:

// Configure bundling and minification for the project.
// More info at https://go.microsoft.com/fwlink/?LinkId=808241
[
 {
    "outputFileName": "wwwroot/js/jquery.min.js",
    "inputFiles": [
      "node_modules/jquery/dist/jquery.js"
    ],
    // Optionally specify minification options
    "minify": {
      "enabled": true,
      "renameLocals": false
    },
    // Optionally generate .map file
    "sourceMap": false
  }
]

Vì vậy, trình gộp và trình thu nhỏ (dựa trên gulp) có quyền truy cập vào các tệp nguồn (sẽ được loại trừ khỏi Visual Studio và cũng bị loại trừ khỏi GIT) và đặt chúng vào wwwroot như được chỉ định

chỉ có tác dụng phụ mỗi khi bạn lưu nó sẽ chạy điều này (nhưng bạn có thể đặt nó chạy theo cách thủ công)


4
Sau khi thấy Bower đã chết và tôi không thể cập nhật Bootstrap nữa mà không chuyển sang NPM, đây có vẻ là cách tiếp cận yêu thích của tôi. Gulp hoặc Webpack có vẻ quá mức cần thiết so với giải pháp đơn giản này đã có trong các mẫu dự án MVC mới nhất. Cảm ơn bạn đã chia sẻ!
Matt Sanders

1
Làm thế nào các hình ảnh tham chiếu trong css được xử lý ở đây? Tôi đang gặp sự cố với hình ảnh vẫn còn trong thư mục node_modules, nơi css và js đã được chuyển đến www. Bất kỳ ý tưởng làm thế nào để sửa chữa điều này?
VPP

1
Đây có phải là IDE-bất khả tri không? Điều này sẽ hoạt động như thế nào nếu một số người trong nhóm của bạn đang sử dụng VS Code và điều này đóng vai trò như thế nào trong một đường dẫn xây dựng CD?
Jacob Stamm

Khi bạn cài đặt gói Bundler và Minifier NuGet, các tài liệu cho biết nó sẽ đưa các mục tiêu xây dựng chạy vào thời gian xây dựng và sạch. Tôi cho rằng một khi nó đã đúng vị trí, nó sẽ hoạt động tốt bất kể IDE nào được sử dụng, phải không? Xem thêm: docs.microsoft.com/en-gb/aspnet/core/client-side/…
Ciaran Gallagher

Trình gói chỉ hữu ích để chỉ định các tập lệnh này bên ngoài môi trường Phát triển. Từ trang _Layout của tôi, tôi vẫn phải tham chiếu thủ công các tệp JS và CSS mà tôi cần, nhưng thư mục node_modules nằm ngoài trang web ... vì vậy tôi không nghĩ rằng điều này giải quyết vấn đề đúng cách, bạn vẫn cần tập lệnh Gulp để sao chép qua các tệp cần thiết vào thư mục wwwroot của tôi.
Ciaran Gallagher

21

Tôi cho bạn hai câu trả lời. npm kết hợp với các công cụ khác rất mạnh mẽ nhưng yêu cầu một số công việc để thiết lập. Nếu bạn chỉ muốn tải xuống một số thư viện, bạn có thể muốn sử dụng Trình quản lý thư viện thay thế (được phát hành trong Visual Studio 15.8).

NPM (Nâng cao)

Đầu tiên hãy thêm package.json vào thư mục gốc của dự án của bạn. Thêm nội dung sau:

{
  "version": "1.0.0",
  "name": "asp.net",
  "private": true,
  "devDependencies": {
    "gulp": "3.9.1",
    "del": "3.0.0"
  },
  "dependencies": {
    "jquery": "3.3.1",
    "jquery-validation": "1.17.0",
    "jquery-validation-unobtrusive": "3.2.10",
    "bootstrap": "3.3.7"
  }
}

Điều này sẽ làm cho NPM tải xuống Bootstrap, JQuery và các thư viện khác được sử dụng trong một dự án lõi asp.net mới vào một thư mục có tên node_modules. Bước tiếp theo là sao chép các tập tin vào một nơi thích hợp. Để làm điều này, chúng tôi sẽ sử dụng gulp, cũng đã được tải xuống bởi NPM. Sau đó, thêm một tệp mới trong thư mục gốc của bạn có tên là gulpfile.js . Thêm nội dung sau:

/// <binding AfterBuild='default' Clean='clean' />
/*
This file is the main entry point for defining Gulp tasks and using Gulp plugins.
Click here to learn more. http://go.microsoft.com/fwlink/?LinkId=518007
*/

var gulp = require('gulp');
var del = require('del');

var nodeRoot = './node_modules/';
var targetPath = './wwwroot/lib/';

gulp.task('clean', function () {
    return del([targetPath + '/**/*']);
});

gulp.task('default', function () {
    gulp.src(nodeRoot + "bootstrap/dist/js/*").pipe(gulp.dest(targetPath + "/bootstrap/dist/js"));
    gulp.src(nodeRoot + "bootstrap/dist/css/*").pipe(gulp.dest(targetPath + "/bootstrap/dist/css"));
    gulp.src(nodeRoot + "bootstrap/dist/fonts/*").pipe(gulp.dest(targetPath + "/bootstrap/dist/fonts"));

    gulp.src(nodeRoot + "jquery/dist/jquery.js").pipe(gulp.dest(targetPath + "/jquery/dist"));
    gulp.src(nodeRoot + "jquery/dist/jquery.min.js").pipe(gulp.dest(targetPath + "/jquery/dist"));
    gulp.src(nodeRoot + "jquery/dist/jquery.min.map").pipe(gulp.dest(targetPath + "/jquery/dist"));

    gulp.src(nodeRoot + "jquery-validation/dist/*.js").pipe(gulp.dest(targetPath + "/jquery-validation/dist"));

    gulp.src(nodeRoot + "jquery-validation-unobtrusive/dist/*.js").pipe(gulp.dest(targetPath + "/jquery-validation-unobtrusive"));
});

Tệp này chứa mã JavaScript được thực thi khi dự án được xây dựng và làm sạch. Nó sẽ sao chép tất cả các tệp cần thiết sang lib2 ( không phải lib - bạn có thể dễ dàng thay đổi điều này ). Tôi đã sử dụng cấu trúc tương tự như trong một dự án mới, nhưng thật dễ dàng để thay đổi tệp sang một vị trí khác. Nếu bạn di chuyển tệp, hãy đảm bảo rằng bạn cũng cập nhật _Layout.cshtml . Lưu ý rằng tất cả các tệp trong thư mục lib2 sẽ bị xóa khi dự án được làm sạch.

Nếu bạn nhấp chuột phải vào gulpfile.js , bạn có thể chọn Task Runner Explorer . Từ đây, bạn có thể chạy gulp theo cách thủ công để sao chép hoặc xóa tệp.

Gulp cũng có thể hữu ích cho các tác vụ khác như rút gọn tệp JavaScript và CSS:

https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.1

Trình quản lý Thư viện (Đơn giản)

Nhấp chuột phải vào dự án của bạn và chọn Quản lý thư viện phía máy khách . Tệp libman.json hiện đã được mở. Trong tệp này, bạn chỉ định thư viện và tệp nào sẽ sử dụng và nơi chúng nên được lưu trữ cục bộ. Thực sự đơn giản! Tệp sau đây sao chép các thư viện mặc định được sử dụng khi tạo một dự án ASP.NET Core 2.1 mới:

{
  "version": "1.0",
  "defaultProvider": "cdnjs",
  "libraries": [
    {
      "library": "jquery@3.3.1",
      "files": [ "jquery.js", "jquery.min.map", "jquery.min.js" ],
      "destination": "wwwroot/lib/jquery/dist/"
    },
    {
      "library": "jquery-validate@1.17.0",
      "files": [ "additional-methods.js", "additional-methods.min.js", "jquery.validate.js", "jquery.validate.min.js" ],
      "destination": "wwwroot/lib/jquery-validation/dist/"
    },
    {
      "library": "jquery-validation-unobtrusive@3.2.10",
      "files": [ "jquery.validate.unobtrusive.js", "jquery.validate.unobtrusive.min.js" ],
      "destination": "wwwroot/lib/jquery-validation-unobtrusive/"
    },
    {
      "library": "twitter-bootstrap@3.3.7",
      "files": [
        "css/bootstrap.css",
        "css/bootstrap.css.map",
        "css/bootstrap.min.css",
        "css/bootstrap.min.css.map",
        "css/bootstrap-theme.css",
        "css/bootstrap-theme.css.map",
        "css/bootstrap-theme.min.css",
        "css/bootstrap-theme.min.css.map",
        "fonts/glyphicons-halflings-regular.eot",
        "fonts/glyphicons-halflings-regular.svg",
        "fonts/glyphicons-halflings-regular.ttf",
        "fonts/glyphicons-halflings-regular.woff",
        "fonts/glyphicons-halflings-regular.woff2",
        "js/bootstrap.js",
        "js/bootstrap.min.js",
        "js/npm.js"
      ],
      "destination": "wwwroot/lib/bootstrap/dist"
    },
    {
      "library": "list.js@1.5.0",
      "files": [ "list.js", "list.min.js" ],
      "destination": "wwwroot/lib/listjs"
    }
  ]
}

Nếu bạn di chuyển tệp, hãy đảm bảo rằng bạn cũng cập nhật _Layout.cshtml .


2
Trình quản lý Thư viện - chưa bao giờ nghe nói về nó, nhưng chính xác là những gì tôi cần! Đây phải là câu trả lời chính xác.
codeMonkey

1
Để tránh một lỗi ngụm tôi đã phải thay đổi dòng đầu tiên của nhiệm vụ mặc định trong tập tin gulpfile.jsđể gulp.task('default', function (done) {và sau đó thêm như một dòng cuối cùng trong chức năng mà những điều sau đây: done();Nếu không tôi sẽ nhận được thông báo lỗiThe following tasks did not complete: Did you forget to signal async completion?
Manfred

7

Thay vì cố gắng phục vụ thư mục mô-đun nút, bạn cũng có thể sử dụng Gulp để sao chép những gì bạn cần vào wwwroot.

https://docs.asp.net/en/latest/client-side/using-gulp.html

Điều này cũng có thể hữu ích

Visual Studio 2015 ASP.NET 5, tác vụ Gulp không sao chép tệp từ node_modules


4
Tôi thực sự thích liên kết thứ hai, có vẻ quen thuộc bằng cách nào đó. ;)
David Pine

1
Không thuận tiện lắm khi bạn trộn các tệp nguồn ứng dụng web ASP.NET Core với các mô-đun npm và đầu ra xây dựng mã phía máy khách. Đó là lý do tại sao nhóm ASP.NET loại bỏ Gulp, package.json khỏi các mẫu dự án ASP.NET MVC mặc định.
Konstantin Tarkus

Tôi không biết điều đó. Khi tôi tham gia VS Live vào tháng 3, họ đều nói về điều đó, nhưng nó đã thay đổi rất nhiều kể từ đó.
Dave_750

6

Cách tiếp cận phù hợp để làm điều này là gì?

Có rất nhiều cách tiếp cận "đúng", bạn chỉ cần quyết định cách nào phù hợp nhất với nhu cầu của mình. Có vẻ như bạn đang hiểu sai cách sử dụng node_modules...

Nếu bạn quen thuộc với NuGet, bạn nên nghĩ đến npm như một đối tác phía máy khách của nó. Nơi node_modulesthư mục giống như binthư mục cho NuGet . Ý tưởng là thư mục này chỉ là một vị trí chung để lưu trữ các gói, theo ý kiến ​​của tôi, tốt hơn là bạn nên chọn dependencycác gói bạn cần như bạn đã làm trong package.json. Sau đó, sử dụng một trình chạy tác vụ Gulpchẳng hạn như để sao chép các tệp bạn cần vào wwwrootvị trí mong muốn của bạn .

Tôi đã viết một bài đăng trên blog về vấn đề này vào tháng Giêng với chi tiết về npm , Gulp và một loạt các chi tiết khác vẫn còn phù hợp cho đến ngày nay. Ngoài ra, ai đó đã kêu gọi sự chú ý đến câu hỏi SO của tôi mà tôi đã hỏi và cuối cùng tự trả lời ở đây , điều này có lẽ hữu ích.

Tôi đã tạo một Gisthiển thị gulpfile.jslàm ví dụ.

Đối với bạn, Startup.csđiều quan trọng vẫn là sử dụng các tệp tĩnh:

app.UseStaticFiles();

Điều này sẽ đảm bảo rằng ứng dụng của bạn có thể truy cập những gì nó cần.


3
"Tôi đã viết một bài đăng trên blog về vấn đề này vào tháng Giêng với chi tiết về npm, Gulp và một loạt các chi tiết khác vẫn còn phù hợp cho đến ngày nay." thực tế là từ tháng 1 đến tháng 6 và bạn phải đề cập đến vẫn còn có liên quan, chính xác là vấn đề của tôi khi bận tâm tìm hiểu bất kỳ thứ gì trong số những điều này. Tôi đã có quá nhiều thứ để học mà không lãng phí thời gian của mình vào thời trang. Không phải lỗi của bạn, David, bạn đang rất hữu ích, nhưng tôi không thích thế giới mới phù du này.
Luke Puplett,

5

Phương pháp đơn giản hơn nhiều là sử dụng OdeToCode.UseNodeModules NuGet gói. Tôi vừa thử nghiệm nó với .Net Core 3.0. Tất cả những gì bạn cần làm là thêm gói vào giải pháp và tham chiếu nó trong phương thức Định cấu hình của lớp Khởi động:

app.UseNodeModules();

Tôi đã học về nó từ khóa học Xây dựng ứng dụng web tuyệt vời với ASP.NET Core, MVC, Entity Framework Core, Bootstrap và Angular Pluralsight của Shawn Wildermuth.


1
Và làm thế nào để bạn thêm các gói npm?
Luca Ziegler

Có một số cách để thêm gói npm vào dự án của bạn. Tôi thích chỉ nhập chúng vào tệp package.json dưới nút phụ thuộc như được giải thích ở đây: stackoverflow.com/a/49264424/5301317
Mariusz Bialobrzeski

@MariuszBialobrzeski Cảm ơn bạn đã chia sẻ. Đây là một giải pháp gọn gàng.
Sau001

@MariuszBialobrzeski Bạn có phải làm gì thêm để triển khai nội dung tĩnh từ node_modules trong đường ống DevOps của mình không? Hay bạn đã kiểm tra trong thư mục node_modules?
Sau001

1
@ Sau001 Rất tiếc là tôi chưa bao giờ có cơ hội làm việc với các đường ống DevOps. Thư mục node_modules có xu hướng trở nên khá lớn vì vậy tôi chắc chắn sẽ tránh kiểm tra nó nếu có thể.
Mariusz Bialobrzeski

1

Shawn Wildermuth có một hướng dẫn hay ở đây: https://wildermuth.com/2017/11/19/ASP-NET-Core-2-0-and-the-End-of-Bower

Bài viết liên kết đến gulpfile trên GitHub, nơi anh ấy thực hiện chiến lược trong bài viết. Bạn chỉ có thể sao chép và dán hầu hết nội dung gulpfile vào của bạn, nhưng hãy đảm bảo thêm các gói thích hợp trong package.json trong devDependencies: gulp gulp-uglify gulp-concat rimraf merge-stream


1

Tôi đã tìm thấy một cách tốt hơn để quản lý các gói JS trong dự án của mình với trình chạy tác vụ NPM Gulp / Grunt. Tôi không thích ý tưởng có một NPM với một lớp thư viện javascript khác để xử lý "tự động hóa" và yêu cầu số một của tôi là chạy bản cập nhật npm một cách đơn giản mà không phải lo lắng về việc liệu tôi có cần chạy nội dung gulp hay không, nếu nó đã sao chép thành công mọi thứ và ngược lại.

Cách NPM:

  • Trình thu nhỏ JS đã được đóng gói trong lõi ASP.net, hãy tìm kiếm Bundconfig.json để đây không phải là vấn đề đối với tôi (không phải biên dịch thứ gì đó tùy chỉnh)
  • Điều tốt về NPM là có cấu trúc tệp tốt nên tôi luôn có thể tìm thấy các phiên bản được biên dịch trước / rút gọn của các phụ thuộc trong node_modules / module / dist
  • Tôi đang sử dụng tập lệnh NPM node_modules / .hooks / {eventname} đang xử lý việc sao chép / cập nhật / xóa các tệp Project / wwwroot / lib / module / dist / .js, bạn có thể tìm tài liệu tại đây https: // docs.npmjs.com/misc/scripts (Tôi sẽ cập nhật tập lệnh mà tôi đang sử dụng để git khi nó sẽ được trau chuốt hơn) Tôi không cần thêm trình chạy tác vụ ( công cụ .js mà tôi không thích) điều gì giữ cho dự án của tôi sạch sẽ và đơn giản.

Con trăn theo cách:

https://pypi.python.org/pyp ... nhưng trong trường hợp này, bạn cần duy trì các nguồn theo cách thủ công


1

Xin miễn chiều dài của bài đăng này.

Đây là một ví dụ làm việc sử dụng ASP.NET Core phiên bản 2.5.

Một điều cần lưu ý là project.json đã lỗi thời ( xem tại đây ) thay vì .csproj . Sự cố với .csproj . là một lượng lớn các tính năng và thực tế là không có vị trí trung tâm cho tài liệu của nó ( xem tại đây ).

Một điều nữa, ví dụ này đang chạy lõi ASP.NET trong vùng chứa Docker Linux (alpine 3.9); vì vậy các đường dẫn sẽ phản ánh điều đó. Nó cũng sử dụng gulp ^ 4.0. Tuy nhiên, với một số sửa đổi, nó sẽ hoạt động với các phiên bản cũ hơn của ASP.NET Core, Gulp, NodeJS và cũng không có Docker.

Nhưng đây là một câu trả lời:

gulpfile.js xem hoạt động thực sự hoạt động hiệu quả tại đây

// ROOT and OUT_DIR are defined in the file above. The OUT_DIR value comes from .NET Core when ASP.net us built.
const paths = {
    styles: {
        src: `${ROOT}/scss/**/*.scss`,
        dest: `${OUT_DIR}/css`
    },
    bootstrap: {
        src: [
            `${ROOT}/node_modules/bootstrap/dist/css/bootstrap.min.css`,
            `${ROOT}/node_modules/startbootstrap-creative/css/creative.min.css`
        ],
        dest: `${OUT_DIR}/css`
    },
    fonts: {// enter correct paths for font-awsome here.
        src: [
            `${ROOT}/node_modules/fontawesome/...`,
        ],
        dest: `${OUT_DIR}/fonts`
    },
    js: {
        src: `${ROOT}/js/**/*.js`,
        dest: `${OUT_DIR}/js`
    },
    vendorJs: {
        src: [
            `${ROOT}/node_modules/jquery/dist/jquery.min.js`
            `${ROOT}/node_modules/bootstrap/dist/js/bootstrap.min.js`
        ],
        dest: `${OUT_DIR}/js`
    }
};

// Copy files from node_modules folder to the OUT_DIR.
let fonts = () => {
    return gulp
        .src(paths.styles.src)
        .pipe(gulp.dest(paths.styles.dest));
};

// This compiles all the vendor JS files into one, jsut remove the concat to keep them seperate.
let vendorJs = () => {
    return gulp
        .src(paths.vendorJs.src)
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest(paths.vendorJs.dest));
}

// Build vendorJs before my other files, then build all other files in parallel to save time.
let build = gulp.series(vendorJs, gulp.parallel(js, styles, bootstrap));

module.exports = {// Only add what we intend to use externally.
    default: build,
    watch
};

Thêm Mục tiêu trong tệp .csproj . Lưu ý rằng chúng tôi cũng đã thêm một Watch để theo dõi và loại trừ nếu chúng tôi lợi dụng dotnet run watchlệnh.

app.csprod

  <ItemGroup>
    <Watch Include="gulpfile.js;js/**/*.js;scss/**/*.scss" Exclude="node_modules/**/*;bin/**/*;obj/**/*" />
  </ItemGroup>

  <Target Name="BuildFrontend" BeforeTargets="Build">
    <Exec Command="yarn install" />
    <Exec Command="yarn run build -o $(OutputPath)" />
  </Target>

Bây giờ khi dotnet run buildchạy nó cũng sẽ cài đặt và xây dựng các mô-đun nút.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.