如何从 asp.net vnext 项目中的 wwwroot 访问 node_modules 文件夹

How to access node_modules folder from wwwroot in asp.net vnext project

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

但是怎么办?

我不想将整个 node_modules 文件夹复制到 wwwroot。这些不是存放在那里的文件...

我不想将 node_modules 文件夹包含到解决方案中,因为这会减慢一切并挂断...

前端开发似乎不属于 VS...

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

上面的一切都是禁区。

典型的发布过程是,当您的 ASP.NET web 项目被编译或发布时,您有一个 gulp 或 g运行t 任务 运行s,它运行 那里的任务并复制 wwwroot 文件夹内的必要文件,即 wwwroot/libswwwdata/js

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

虽然它没有显示在解决方案中(只是间接地显示在 Dependencies/npm 部分),您仍然可以通过点击解决方案资源管理器顶部的 "Show all files" 按钮使其可见,然后复制你需要的文件。

不过最好给它设置一个gulp任务,但这不在本题范围内

至少有两个理智的选择:

  • 使用 app.UseStaticFiles 服务其他文件夹。原解来自Ode to Code。我用它来 发展,因为 Visual Studio 似乎不尊重当地人 .npmrc 文件设置为 prefix = wwwroot/node_modules。理想情况下, node_modules 应该捆绑生产。有 npm rollup 插件 可以使用自动捆绑脚本 import 特性 (ES2015).

  • 从 CDN 提供 node_modules(例如 unpkg.com)。这相当简单,唯一的缺点是 CDN 的 响应时间,特别是如果您禁用了浏览器缓存 开发目的。

这是在 ASP.NET Core 中为文件夹提供服务的代码。 您只需要更改 Startup class:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ...some other stuff

    if (env.IsDevelopment())
    {
        ServeFromDirectory(app, env, "node_modules");
    }
}

public void ServeFromDirectory(IApplicationBuilder app, IHostingEnvironment env, string path)
{
    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.ContentRootPath, path)
        ),
        RequestPath = "/" + path
    });
}