Npm 如何从asp.net vnext项目中的wwwroot访问节点_模块文件夹

Npm 如何从asp.net vnext项目中的wwwroot访问节点_模块文件夹,npm,asp.net-core,asp.net-core-mvc,node-modules,asp.net-core-1.0,Npm,Asp.net Core,Asp.net Core Mvc,Node Modules,Asp.net Core 1.0,如何从放置my index.html的wwwroot访问未包含在visual studio解决方案文件中的node_modules文件夹。该index.html文件需要引用npm安装的包,如angular.js 但是怎么做呢 我不想将整个node_modules文件夹复制到wwwroot中。那些不是住在那里的文件 我不想将node_modules文件夹包含到解决方案中,因为这会减慢所有操作并挂断 前端开发似乎不属于VS.您不应该从wwwroot外部访问文件。wwwroot文件夹是一个公共文件夹,

如何从放置my index.html的wwwroot访问未包含在visual studio解决方案文件中的node_modules文件夹。该index.html文件需要引用npm安装的包,如angular.js

但是怎么做呢

我不想将整个node_modules文件夹复制到wwwroot中。那些不是住在那里的文件

我不想将node_modules文件夹包含到解决方案中,因为这会减慢所有操作并挂断


前端开发似乎不属于VS.

您不应该从
wwwroot
外部访问文件。
wwwroot
文件夹是一个公共文件夹,当您托管它时,可以从外部访问它

一切都是禁区

典型的发布过程是,在编译或发布ASP.NET Web项目时,您有一个“吞咽”或“咕噜”任务,它将在那里运行任务并复制
wwwroot
文件夹中的必要文件,即
wwwroot/libs
wwwdata/js

当然,您也可以手动复制文件,但这相当糟糕,尤其是当您更新许多依赖项时,很难手动跟踪

虽然它不显示在解决方案中(只是间接地显示在
依赖项/npm
部分),但您仍然可以通过点击解决方案资源管理器顶部的“显示所有文件”按钮,并复制所需的文件,使其可见


但是最好为它设置一个吞咽任务,但这超出了这个问题的范围。

至少有两个明智的选择:

  • 使用
    app.UseStaticFiles
    为其他文件夹提供服务。最初的解决方案来自。我用它来 开发,因为VisualStudio似乎不尊重本地
    .npmrc
    使用
    前缀=wwwroot/node_模块设置的文件
    。理想的,
    node_模块
    应捆绑生产。有一种方法可以使用自动绑定脚本
    导入
    功能(ES2015)

  • 为CDN中的节点单元模块提供服务(例如unpkg.com)。这相当简单,唯一的缺点是CDN 响应时间,特别是在禁用浏览器缓存的情况下 发展目的

以下是在ASP.NET Core中为文件夹提供服务的代码。您只需更改
启动
类:

public void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
…一些其他的东西
if(env.IsDevelopment())
{
ServeFromDirectory(应用程序,环境,“节点单元模块”);
}
}
public void ServeFromDirectory(IAApplicationBuilder应用程序、IHostingEnvironment环境、字符串路径)
{
app.UseStaticFiles(新的StaticFileOptions
{
FileProvider=新的物理FileProvider(
Path.Combine(env.ContentRootPath,Path)
),
RequestPath=“/”+路径
});
}

是否有一种更自动化的方法来执行此操作,跟踪每个npm依赖项的哪个文件和路径是一件乏味的事情。@Tseng如果我使用SystemJS就不会了。现在,我仍然坚持使用jspm和节点的重复依赖项,这样VS typescript就不会抱怨了。我花了一段时间才弄清楚这一点,所以我将分享我的知识:你应该采取谨慎的步骤复制你需要的文件,将它们与你不需要的文件结合起来,并将它们复制到您无法使用它们的地方。然后,由于您无法使用所需的文件,您会重复将文件从无法使用的位置复制到可以使用的位置。当我意识到我可以安装和配置一个实用程序来为我完成这项工作时,我个人的灵感就来了。@BrianMacKay的目标是将您的js下载到node_模块中,并从那里使用它,而无需额外复制。您可以像您的dev机器一样设置prod机器,并且作为部署或构建的一部分,运行npm更新。您的prod服务器将指向node_模块,一切正常。rgrippers下面的答案显示了如何做this@Sam谢谢,山姆。我无法告诉你我今天在这上面浪费了多少时间,试图遵循实际上并不存在的最佳实践。这样一个愚蠢的、没有成效的问题。。。这里应该有明确的指导。这个解决方案太短视了:无法在
wwwroot
之外发布任何静态文件/资源!那么如何部署
node_模块
?@Marcel我的答案是在
wwwroot
之外提供文件的一种有效方式。一般来说,再也没有人发布
node\u模块了
——每个人都使用捆绑包。“从CDN服务node\u模块”——这真是个糟糕的建议。这基本上是在制造一个定时炸弹,一旦CDN公司在X年内关闭其域名,你的网站就会停止工作——如果域名被接管,脚本被恶意软件(如比特币挖掘脚本)取代,你就会面临漏洞。自2020年以来,由于浏览器实现了逐站点缓存隔离,使用共享CDN对性能没有任何好处。