如何在ASP.NET Core中使用npm
我使用npm来pipe理我的ASP.NET Core应用程序所需的jQuery,Bootstrap,Font Awesome和类似的客户端库。
这个方法对我来说是通过在项目中添加一个package.json文件开始的,如下所示:
{ "version": "1.0.0", "name": "myapp", "private": true, "devDependencies": { }, "dependencies": { "bootstrap": "^3.3.6", "font-awesome": "^4.6.1", "jquery": "^2.2.3" } }
npm将这些软件包恢复到与项目目录中wwwroot相同级别的node_modules文件夹中:
由于ASP.NET Core服务于wwwroot文件夹中的静态文件,并且node_modules不存在,所以我不得不作出一些更改以使其工作,第一个:在我的Startup中的app.UseStaticFiles之前添加app.UseFileServer。 cs文件:
app.UseFileServer(new FileServerOptions() { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")), RequestPath = new PathString("/node_modules"), EnableDirectoryBrowsing = true }); app.UseStaticFiles();
第二个,包括project.json文件的publishOptions中的node_modules:
"publishOptions": { "include": [ "web.config", "wwwroot", "Views", "node_modules" ] },
这在我的开发环境中工作,它也适用于我部署到我的Azure应用程序服务实例,jquery,引导和字体真棒静态文件得到良好的服务,但我不知道这个实现。
这样做的正确方法是什么?
这个解决scheme在收集了很多来自多个源的信息之后,尝试了一些不起作用的东西,似乎有点奇怪,从wwwroot的外部提供这些文件。
任何意见将不胜感激。
通过发布您的整个node_modules
文件夹,您将部署的文件远远超出实际需要的产品数量。
相反,使用任务运行器作为构build过程的一部分来打包所需的文件,并将其部署到您的wwwroot
文件夹。 这也可以让你同时连接和缩小你的资产,而不必分别服务于每个单独的图书馆。
然后,您也可以完全删除FileServer
configuration,并在UseStaticFiles
回复。
目前,gulp是VS任务的首选。 将gulpfile.js
添加到项目的根目录,并将其configuration为在发布时处理您的静态文件。
例如,您可以将以下scripts
部分添加到您的project.json
:
"scripts": { "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ] },
这将与以下gulpfile(默认脚手架与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"]);
- 使用
npm
pipe理客户端库是一个不错的select(相对于Bower或NuGet),你正在考虑正确的方向:) - 将服务器端(ASP.NET Core)和客户端(例如Angular 2,Ember,React)分离到不同的文件夹中(否则你的ASP.NET项目可能会有很多噪音 – 客户端代码的unit testing,node_modules文件夹,构build文物等)。 与你在同一个团队工作的前端开发人员会感谢你:)
- 在解决scheme级别还原npm模块(类似于如何通过NuGet恢复软件包,而不是通过项目文件夹),这样,您可以在单独的文件夹中进行unit testing和集成testing(而不是在客户端进行JavaScripttestingASP.NET核心项目)。
- 使用可能不需要
FileServer
,StaticFiles
应该足以提供静态文件(.js,图像等) - 使用Webpack将客户端代码绑定到一个或多个块(捆绑)
- 如果您使用Webpack等模块打包程序,则可能不需要Gulp / Grunt
- 在ES2015 + JavaScript(而不是Bash或PowerShell)中编写自动化脚本,他们将跨平台工作,更容易被各种Web开发人员访问(现在每个人都在说JavaScript)
- 将
wwwroot
重命名为public
,否则Azure Web Apps中的文件夹结构将会混淆(D:\Home\site\wwwroot\wwwroot
与D:\Home\site\wwwroot\public
) - 只发布编译的输出到Azure Web Apps(你不应该把
node_modules
推到一个虚拟主机服务器上)。 以tools/deploy.js
为例。
访问GitHub上的ASP.NET核心入门套件 (免责声明:我是作者)
不要尝试提供节点模块文件夹,也可以使用Gulp将需要的文件复制到wwwroot。
https://docs.asp.net/en/latest/client-side/using-gulp.html
这也可能有帮助
Visual Studio 2015 ASP.NET 5,Gulp任务不复制node_modules中的文件
这样做的正确方法是什么?
有很多“正确”的方法,你只是决定哪一个最适合您的需求。 看起来好像你误解了如何使用node_modules
…
如果你对NuGet很熟悉,你应该把npm当作客户端的对手。 其中node_modules
目录与NuGet的bin
目录相似。 这个想法是,这个目录只是一个存储包的常用位置,在我看来,最好是像在package.json
一样, dependency
于你需要的package.json
。 然后使用像Gulp
这样的任务运行者来将您需要的文件复制到您想要的wwwroot
位置。
今年1月份,我写了一篇博文 ,详细介绍了npm , gulp以及其他一些今天仍然相关的细节。 此外,有人呼吁关注我提出的问题,并最终在这里回答自己,这可能是有帮助的。
我创build了一个以gulpfile.js
为例的Gist
。
在您的Startup.cs
,使用静态文件仍然很重要:
app.UseStaticFiles();
这将确保您的应用程序可以访问它的需要。
将Bundler和Minifier安装到Visual Studio扩展中
然后你创build一个bundleconfig.json
并input如下所示:
// 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 } ]
因此,bundler和minifier(基于gulp)可以访问源文件(这些文件应该从Visual Studio中排除,也可以从GIT中排除),并按照指定将它们放入wwwroot中
只有副作用,每次你保存它会运行这个(或者你可以设置它或手动运行)
- Visual Studio 2017安装打破了Visual Studio 2015 ASP.NET核心项目
- 如何获得当前用户在asp.net核心
- 在ASP.NET Core MVC中select标签助手
- 使用HttpClient PostAsJsonAsync在ASP.NET Core中发送HTTP POST消息
- 迷失在版本和工具中:.NET核心,核心工具,dotnet核心CLI,
- 如何确定是否安装了.netcore
- 如何从ASP.NET Core中的Config.json中读取AppSettings值
- 使用ASP.NET Core Web应用程序(.NET Core)与net461设置为唯一框架并使用(.NET Framework)模板之间的区别
- parsing并修改.NET Core中的查询string