首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用webpack ignorePlugin从最终包中删除“反应热装载机”

用webpack ignorePlugin从最终包中删除“反应热装载机”
EN

Stack Overflow用户
提问于 2019-11-05 17:55:11
回答 3查看 943关注 0票数 2

react-hot-loader文档就是这样说的:

https://www.npmjs.com/package/react-hot-loader 注意:您可以安全地将react热加载器作为常规依赖项而不是dev依赖项安装,因为它的自动确保它不会在生产中执行,并且占用空间最小.

,尽管它这么说。我的目标是:

  • 我想从我的生产包中删除react-hot-loader
  • 我还想要一个App.js文件。这应该适用于DEV和PROD。

我与react-hot-loader相关的唯一命令是在我的App.js文件中:

App.js

代码语言:javascript
复制
import { hot } from 'react-hot-loader/root';
import React from 'react';
import Layout from './Layout/Layout';

function App() {
  console.log('Rendering App...');
  return(
    <Layout/>
  );
}

export default process.env = hot(App);

如果我像这样运行它,我将在我的app.js转换和捆绑文件上得到以下行:

WEBPACK VAR注入/(函数(进程) {/和谐导入/ var react_hot_loader_root__WEBPACK_IMPORTED_MODULE___ = webpack_require__(/!)反应-热装载机/根*/ "wSuE");

这是意料之中的。

但是,如果我将App.js文件更改为:

AppV2.js

代码语言:javascript
复制
import { hot } from 'react-hot-loader/root';  // KEEPING THE IMPORT
import React from 'react';
import Layout from './Layout/Layout';

function App() {
  console.log('Rendering App...');
  console.log(window);
  return(
    <Layout/>
  );
}

// export default hot(App); <--- COMMENTED OUT THE hot() LINE
export default App;

我将这一行添加到我的webpack.config.js

webpack.config.js

代码语言:javascript
复制
plugins:[
  new webpack.IgnorePlugin(/react-hot-loader/)
]

最后,我将使用以下行获得一个新的转置app.js文件:

*!(函数webpackMissingModule() { var e=新错误(“无法找到模块‘root热加载程序/根”);e.code =’模块_NOT_ find‘;抛出e;}();

注意:上面一行中的第一个“*”字符实际上并不存在。我不得不把它们加进去!将在报价中显示的显示标记。不知道为什么,但你不能用感叹号开始引用。

问题

难道IgnorePlugin不应该完全忽略react-hot-loader包吗?为什么它被标记为失踪了?确保它甚至不在代码中使用(因为我已经注释掉了hot()调用)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-05 20:29:58

忽略插件只排除了包生成中的特定模块。但是,它不会从源代码中删除对模块的引用。因此,你的webpack输出正在抛出这个错误。

绕过此错误的一种方法是使用DefinePluginreact-hot-loader创建一个虚拟存根。更多关于这里的报道。

这就是说,如果react-hot-loaderproduction,那么它本身就会代理孩子,而不会有任何改变。检查这里这里。因此,在生产模式中,除了直接返回组件的hot()函数调用之外,没有其他事情发生。

票数 3
EN

Stack Overflow用户

发布于 2019-11-06 06:38:06

另一种选择可以是:

代码语言:javascript
复制
// App.js
export default function AppFactory() {
    if (process.env.NODE_ENV === "development") {
        return hot(App);
    } else {
        return App;
    }
}

// index.js:
import AppFactory from './App';
const App = AppFactory();
// ...
<App />

现在,由于webpack正在构建时创建包,它知道模式是开发还是生产(更多关于构建模式),并且应该能够用树摇动UglifyjsWebpackPlugin消除死代码。

确保如果您正在使用Babel,它不会将您的代码转到CommonJS --参见结论部分,树抖动页面的第2点。

票数 1
EN

Stack Overflow用户

发布于 2022-05-05 17:51:03

将环境模式传递给babel。

代码语言:javascript
复制
"scripts": {
  "build-dev": "webpack --node-env development",
  "build-prod": "webpack --node-env production",
},
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58716932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档