在 .Net Core 2.0 和 Angular 中使用 'dotnet publish' 时找不到模块 'aspnet-webpack'

Cannot find module 'aspnet-webpack' when using 'dotnet publish' in .Net Core 2.0 & Angular

我一直在努力寻找这个问题的答案,但无济于事。我正在尝试使用命令行命令发布我的 .Net Core 2.0 和 Angular 项目 'dotnet publish' 我成功了发布,但是当尝试 运行 我的项目的 .dll 在发布的文件夹中时,我的项目在开发环境中 运行 时吐出这个错误:

Unhandled Exception: System.AggregateException: One or more errors occurred. (Webpack dev middleware failed because of an error while loading 'aspnet-webpack'. Error was: Error: Cannot find module 'aspnet-webpack'

当 运行 在生产环境中并允许 DeveloperExceptionPage(如下面我的 statup.cs 所示).netcore 应用程序 运行s,但在实际的网络应用程序中崩溃,我假设是由于较大的错误,未找到 aspnet-webpack:

NodeInvocationException: Uncaught (in promise): Error: No component factory found for HomeComponent. Did you add it to @NgModule.entryComponents?

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
                HotModuleReplacement = true
            });
        }
        else
        {
            //app.UseExceptionHandler("/Home/Error");
            app.UseDeveloperExceptionPage();
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

            routes.MapSpaFallbackRoute(
                name: "spa-fallback",
                defaults: new { controller = "Home", action = "Index" });
        });
    }
}

我没有使用 @Angular/Cli,但我使用的是 VS2017(我相信是八月更新?)生成的默认 Angular 项目,它似乎只使用 Webpack。问题似乎是项目的生产配置需要一个我没有提供的参考,但我不明白为什么会这样。

到目前为止,这个问题的其他答案对我没有帮助,所以如果这是一个重复的问题,我深表歉意。

我和“aspnet-webpack”有同样的问题,这是在项目开发的中途引入的,所以我有点惊讶地看到解决方案突然死亡。在 IIS 上几个月一切正常,但突然无法启动。

IIS 日志文件没有帮助,所以我尝试了解决这两种方法,其中一种有效。 快点!

解决方案

我 运行 关注包管理器 window :

dotnet run --project <Full path of *.csproj> --configuration Debug

它给了我一些指示,我开始搜索“Error: Cannot find module 'aspnet-webpack”问题。我尝试检查最后几次签到的所有更改,发现我们将“Microsoft.AspNetCore.All”从 2.0.0 更新为 2.0.3 版本,因此将其降级为原始版本固定它。

我猜他们都使用不同版本的节点包。所以除非有充分的理由,否则不要为了更新而更新。阅读这篇文章,一些位与特定版本非常紧密地耦合,并且 Angular 很容易中断,如果有什么改变的话。虽然我已经设法将节点版本升级到最新的 5.0.0

喜欢寻找更多细节,但暂时没有详细说明为什么需要特定版本。

在您发布 .Net Core 2.0 和 Angular 项目之后,在您 运行 它之前,您需要确保环境变量 ASPNETCORE_ENVIRONMENT 未设置为 Development .已发布的项目不包括对 WebpackDevMiddleware 或 HotModuleReplacement 的支持。但如果环境设置为开发,它将尝试使用它们。

HotModuleReplacement 会在源文件更改时自动更新 Web 浏览器中的 Webpack 构建资源(例如 JavaScript、CSS 或图像)。这显然是您在生产中不希望看到的。

如果 ASPNETCORE_ENVIRONMENT 设置为 "Development",您可以更改设置:

setx ASPNETCORE_ENVIRONMENT "Production"

您需要关闭当前命令 window 并打开另一个命令以查看更改。

你也可以在startup.cs中注释掉下面的代码来达到同样的效果:

#if DEBUG
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
    HotModuleReplacement = true
});
#endif

检查 node.js 是否安装在生产环境中并且在路径中。

Node.js被webpack使用

同时检查您是否有最新版本的 Node.js (4+)

参考:

Node.js 的版本可以用 :

检查
where.exe node.exe (Windows 7+)

which node.exe (linux bash)

当然,路径环境变量如果指向过时的Node.js

,则应检查和更新

祝一切顺利

我在没有 Angular 的项目中遇到了与您相同的错误:

Unhandled Exception: System.AggregateException: One or more errors occurred. (Webpack dev middleware failed because of an error while loading 'aspnet-webpack'. Error was: Error: Cannot find module 'aspnet-webpack'

结果是一个我容易忘记的节点的简单问题。

npm install

请记住,npm 命令需要 运行 在包含 package.json 文件的顶级目录中。我希望这能帮助那些和我一样有很多问题的人记住 运行 npm 命令。感谢论坛提醒我:

https://www.ebenmonney.com/forum/?view=thread&id=20&part=1#postid-57

确保您已完全安装所有这些依赖项:

npm install webpack-hot-middleware --save-dev
npm install webpack-dev-middleware --save-dev
npm install aspnet-webpack --save-dev

在我的例子中,原因是 SPA(在我的例子中是 Vue)在 ClientApp 文件夹中,app.UseWebpackDevMiddleware 希望它在项目根目录中。

设置 ProjectPath 选项为我解决了这个问题。

app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
  {
    HotModuleReplacement = true,
    ConfigFile = Path.Combine(env.ContentRootPath, @"ClientApp\node_modules\@vue\cli-service\webpack.config.js"),
    ProjectPath = Path.Combine(env.ContentRootPath, @"ClientApp")
  });

startup.cs的AT配置功能 开发环境可以使用if语句

 if (env.IsDevelopment())
        {
            // Print exception and all details for the developer 
            app.UseDeveloperExceptionPage();
            // Use WebPack to update css , js , html automatically 
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
                HotModuleReplacement = true
            });  

        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();

        } 

您可以在命令打印中使用此命令来更改当前环境: setx ASPNETCORE_ENVIRONMENT "Development"

出现此错误的主要原因是您在代码中的某处使用了依赖项,但您的解决方案中并未安装该依赖项。如果您正在使用 visual studio,请尝试使用干净构建,它会显示您项目中的错误,这将帮助您找到它。