将 webpack 构建与 ASP.NET Core 3.0 集成的最佳方式?

问题描述 投票:0回答:4

我正在将 ASP.NET Core 应用程序升级到 V3,并使用 Visual Studio 2019 进行开发/调试。除了这一点之外,整个过程都很顺利:

public void Configure(…..
                app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
                {
                    HotModuleReplacement = false,
                    ReactHotModuleReplacement = false
                });

UseWebpackDevMiddleware 不再存在:https://github.com/aspnet/AspNetCore/issues/12890 .

我现在希望了解每次调试时让 VS 运行 webpack 的最佳方式,最好只在已更改的 JS 代码上运行。这就是我从

UseWebpackDevMiddleware
获得的价值。我的应用程序是一个 React 应用程序,如果您的应用程序是从 CreateReactApp 启动的,那么似乎有一些新的替代品,但我的应用程序不是。 (我相信从此声明但随后分离的应用程序被称为“弹出”。)即使我的应用程序不利用 CreateReactApp,我是否仍然可以利用该设施?另外,CreateReactApp 在引导您的新 React 应用程序后起什么作用?我想它只会用于第一次膨胀模板代码。

Microsoft.AspNetCore.SpaServices.Extensions 在这一切中扮演什么角色?

不需要热更换模块;我不需要服务器端预渲染。我真的只是想了解如何让我的 JS 透明地构建(通过 Webpack)作为我的调试过程的一部分。我可以将其连接到 MSBuild 中吗?我想其他人在升级时也会面临同样的问题。

感谢您的任何建议。

reactjs asp.net-core webpack msbuild asp.net-core-3.0
4个回答
34
投票

因此,我使用

UseWebpackDevMiddleware
进行 HMR 以获得更顺畅的开发过程 - 最后我恢复使用
webpack-dev-server

步骤:

1)将包添加到package.json:

"webpack-dev-server": "3.8.2",
2)添加
webpack.development.js

const merge = require('webpack-merge');
const common = require('./webpack.config.js');
const ExtractCssPlugin = require('mini-css-extract-plugin');

const webpackDevServerPort = 8083;
const proxyTarget = "http://localhost:8492";

module.exports = merge(common(), {
    output: {
        filename: "[name].js",
        publicPath: '/dist/'
    },
    mode: 'development',
    devtool: 'inline-source-map',
    devServer: {
        compress: true,
        proxy: {
            '*': {
                target: proxyTarget
            }
        },
        port: webpackDevServerPort
    },
    plugins: [
        new ExtractCssPlugin({
            filename: "[name].css",
            chunkFilename: "[id].css"
        })
    ]
});

请注意,此处的代理设置将用于代理到 ASP.Net core 进行 API 调用

修改

launchSettings.json
指向 webpack-dev-server:

"profiles": {
    "VisualStudio: Connect to HotDev proxy": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "http://localhost:8083/",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:8492/"
    }
  }

(我在 webpack 中配置正确的位置时遇到了一些问题,并发现 this 有用

此外,还需要启动 webpack-dev-server,这可以通过 npm 脚本完成:

  "scripts": {
    "build:hotdev": "webpack-dev-server --config webpack.development.js --hot --inline",

然后这是自举的

            app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.UseReactDevelopmentServer(npmScript: "build:hotdev");
                }
            });

(或者您可以安装 npm 任务运行程序扩展并且:

  "-vs-binding": {
    "ProjectOpened": [
      "build:hotdev"
    ]
  }

或者,我意识到您可以使用以下方式代理其他方式 - 这样,任何对“dist”下的请求都将被推送到代理

webpack-dev-server

            app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "dist";

                if (env.IsDevelopment())
                {
                    // Ensure that you start webpack-dev-server - run "build:hotdev" npm script
                    // Also if you install the npm task runner extension then the webpack-dev-server script will run when the solution loads
                    spa.UseProxyToSpaDevelopmentServer("http://localhost:8083");
                }
            });

然后您就不再需要从后面代理,只需提供 /dist/ 内容即可 - 热编译和供应商预编译都使用 web.config.js,如下所示:

module.exports = merge(common(), {
    output: {
        filename: "[name].js",
        publicPath: '/dist/',
    },
    mode: 'development',
    devtool: 'inline-source-map',
    devServer: {
        compress: true,
        port: 8083,
        contentBase: path.resolve(__dirname,"wwwroot"),
    },

    plugins: [
        new ExtractCssPlugin({
            filename: "[name].css",
            chunkFilename: "[id].css"
        })
    ]
});

8
投票

克拉姆的回答非常有帮助。我最近花了一些时间建立一个 .NET Core/React/Webpack 项目,我无法让

spa.UseReactDevelopmentServer
工作,但
spa.UseProxyToSpaDevelopmentServer
的工作就像一个魅力。谢谢克拉姆!

以下是我的一些问题,它们可能会对某人有所帮助:

webpack.config.js(摘录):

const path = require('path');
const webpack = require('webpack');

output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'build.[hash].js',
},

devServer: {
    contentBase: path.resolve(__dirname, 'public'),
    publicPath: '/dist',
    open: false,
    hot: true
},

plugins: [
    new webpack.HotModuleReplacementPlugin()
]
  1. DevServer 通过

    publicPath
    属性设置其根,并完全忽略根中的
    output.path
    属性。因此,即使您的输出文件(对于 prod)将转到 dist 文件夹,但在 webpack 服务器下,默认情况下它们将在根目录下提供服务。如果你想保留相同的url,你必须设置
    publicPath: '/dist'
    。 这意味着您的默认页面将位于 http://localhost:8083/dist 下。我无法找到一种方法将资产放置在子文件夹下,同时将索引保留在根目录中(除了对资产的路径进行硬编码)。

  2. 您需要

    HotModuleReplacementPlugin
    才能使观看模式正常工作,还需要
    hot: true
    在 devServer 配置中进行设置(或在启动时将其作为参数传递)。

  3. 如果您(像我一样)使用

    open: true
    复制一些开发服务器配置(默认为 false),您将在应用程序启动时打开两个浏览器,而另一个浏览器由 launchSettings
    "launchBrowser": true
    打开。刚开始的时候有点意外。

此外,您必须为您的项目启用 CORS,否则您的后端调用将被阻止:

Startup.cs(摘录):

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options => 
    {
        options.AddPolicy(name: "developOrigins",
            builder =>
            {
                builder.WithOrigins("http://localhost:8083");
            });
    });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
        app.UseCors("developOrigins");
}

如果我想到其他任何事情,我会更新答案,希望这对某人有帮助。

Webpack 5 更新

webpack-dev-server
命令不再起作用。用途:

"build:hotdev": webpack serve --config webpack.config.development.js

您可能还需要将

target: 'web'
添加到 Webpack 5 中的
webpack.config.js
中,以启用热模块重新加载功能:

module.exports = {
    target: 'web'
}

或者,您可能需要创建一个浏览器列表文件。希望这个问题尽快得到解决。


7
投票

你提到了VS。我的解决方案适用于 Visual Studio,但不适用于 VS Code。

我使用 WebPack 任务运行程序:https://marketplace.visualstudio.com/items?itemName=MadsKristensen.WebPackTaskRunner

这会将 webpack.config.js 任务添加到 Visual Studio 中的“任务运行程序资源管理器”中,然后您可以将这些任务绑定到“构建之前”或“构建之后”等事件


2
投票

扩展在这里:AspNetCore.SpaServices.Extensions

您可以在这里找到示例:https://github.com/RimuTec/AspNetCore.SpaServices.Extensions

采用核心3.1或5.0 使用 webpack 进行反应

使用:

spaBuilder.UseWebpackDevelopmentServer(npmScriptName: "start");

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.