Ben*_*iFB 6 msbuild reactjs webpack asp.net-core asp.net-core-3.0
我正在将我的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,我仍然可以以某种方式利用该功能吗?另外,在启动新的React应用程序之后,CreateReactApp的作用是什么?我以为它只会在一开始就被用于膨胀模板代码。
在所有这些中,Microsoft.AspNetCore.SpaServices.Extensions扮演什么角色?
我不需要热模块更换;我不需要服务器端预渲染。我实际上只是在尝试了解如何在调试过程中通过Webpack透明地构建JS。我可以将其连接到MSBuild吗?我想象其他人在升级时会面临同样的问题。
感谢您的任何建议。
因此,我使用UseWebpackDevMiddlewareHMR进行了更加流畅的开发过程-最后,我恢复使用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核心以进行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中配置正确的位置时遇到了一些问题,发现这很有用
另外,将需要启动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 TaskRunner扩展程序并:
  "-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"
        })
    ]
});
在我看来,克拉姆的答案应该被标记为已接受,因为它确实提供了所需的东西。我最近花了一些时间来设置一个 .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()
]
DevServer 通过publicPath属性设置其根并完全忽略根中的属性output.path。因此,即使您的输出文件(用于 prod)将转到 dist 文件夹,但在 webpack 服务器下,默认情况下它们将在根目录下提供。如果要保留相同的 url,则必须设置publicPath: '/dist'. 这意味着您的默认页面将位于 http://localhost:8083/dist 下。我想不出一种方法将资产放在子文件夹下,同时将索引保留在根目录中(除了硬编码资产的路径)。
您需要HotModuleReplacementPlugin为了观察模式工作并hot: true在 devServer 配置中进行设置(或在启动时将其作为参数传递)。
如果您(像我一样)使用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.config.js的的WebPack 5,使热模块重装工作:
module.exports = {
    target: 'web'
}
或者,您可能需要创建一个浏览器列表文件。希望这个问题尽快得到解决。
| 归档时间: | 
 | 
| 查看次数: | 1114 次 | 
| 最近记录: |