Webpack 开发服务器 + React + Typescript 在源更改后不会注入资产

Posted

技术标签:

【中文标题】Webpack 开发服务器 + React + Typescript 在源更改后不会注入资产【英文标题】:Webpack dev server + React + Typescript wont inject assets after sources change 【发布时间】:2017-08-21 05:23:57 【问题描述】:

我开始构建一个基于 React、TypeScript 和 Webpack 的小应用程序进行构建。我关注了这篇文章:https://www.typescriptlang.org/docs/handbook/react-&-webpack.html

所有源代码都存储在 GitHub 仓库:https://github.com/aszmyd/webpack-react-typescript-bug

问题:

当我启动 webpack 开发服务器进行本地开发时,它会正确地为 localhost:8080 下的文件提供服务,并根据 webpack 配置正确地注入动态资产。 但是当我更改源文件中的某些内容时,重建会被触发,并且一切似乎都被正确触发了,但是 动态资产没有注入到 index.html。因此,在源 tsx 文件发生任何更改后,我在 localhost:8080 处出现空白屏幕,因为 bundle.js 文件 未注入


所以步骤来reporoduce:

    克隆我的测试用例仓库:https://github.com/aszmyd/webpack-react-typescript-bug 使用npm install 安装依赖 运行npm start 转到http://localhost:8080 更改某些内容,即src/components/Hello.tsx

初始生成的 index.html 如下所示:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Hello React!</title>
</head>
<body>
<div id="example"></div>
<script type="text/javascript" src="bundle.js"></script></body>
</html>

在至少 1 次 webpack 开发服务器观看之旅和构建之后:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>Hello React!</title>
</head>
<body>
<div id="example"></div>
</body>
</html>

【问题讨论】:

【参考方案1】:

您同时使用html-webpack-plugincopy-webpack-plugindist 目录中创建index.html

plugins: [
    new CopyWebpackPlugin([
        from: 'index.html',
    ], 
        copyUnmodified: true
    ),
    new HtmlWebpackPlugin(
        filename: 'index.html',
        template: 'index.html'
    ),
    new HtmlWebpackIncludeAssetsPlugin(
        assets: [], append: false, hash: true
    )
]

您不需要copy-webpack-plugin,因为html-webpack-plugin 已经生成index.html 并自动将其放入dist 目录中。尽管它不是必需的,但它实际上会导致热重新加载问题,因为webpack-dev-server 认为新的index.html 是复制的,而不是生成的。要了解发生这种情况的原因,您可以查看重新编译后的输出。

带有复制插件

                                   Asset       Size  Chunks                    Chunk Names
                               bundle.js    1.06 MB       0  [emitted]  [big]  main
    0.135a3b584db27942bf6f.hot-update.js    1.36 kB       0  [emitted]         main
    135a3b584db27942bf6f.hot-update.json   43 bytes          [emitted]
                           bundle.js.map    1.26 MB       0  [emitted]         main
0.135a3b584db27942bf6f.hot-update.js.map  894 bytes       0  [emitted]         main
                              index.html  146 bytes          [emitted]

无复制插件

                                   Asset       Size  Chunks                    Chunk Names
                               bundle.js    1.06 MB       0  [emitted]  [big]  main
    0.135a3b584db27942bf6f.hot-update.js    1.36 kB       0  [emitted]         main
    135a3b584db27942bf6f.hot-update.json   43 bytes          [emitted]
                           bundle.js.map    1.26 MB       0  [emitted]         main
0.135a3b584db27942bf6f.hot-update.js.map  894 bytes       0  [emitted]         main

不同之处在于,使用复制插件,您会发出一个新的index.html,它只是复制的,因为html-webpack-plugin 没有看到任何变化,因此没有发出新的。因此webpack-dev-server 服务于这个新发出的index.html

注意:如果您在文件名中使用了哈希(例如bundle.[hash].js),它会起作用,因为它会在每次重新编译后发出一个新的index.html。无论如何,有冲突的插件不是一个好主意。

【讨论】:

非常感谢!它是如此合乎逻辑,以至于我感到尴尬,我自己还没有弄清楚。但我很高兴你做到了。再次感谢!

以上是关于Webpack 开发服务器 + React + Typescript 在源更改后不会注入资产的主要内容,如果未能解决你的问题,请参考以下文章

带有 React Hot Loader 的 Webpack 开发服务器

使用 react-router 和 webpack 开发服务器的嵌套 url 路由

CORS 与 React、Webpack 和 Axios

webpack开发react常用插件和依赖

React + Webpack:在哪里配置 REST 端点

React Hot Loader v4.0.0 + Webpack 4 开发服务器未更新应用程序