webpack - 导入的 Webpack 模块最终不会成为一个块的原因是什么?
问题描述
我们有一个相当简单的 app/webpack 设置,如下所示:
babel.config.js
module.exports = {
plugins: [...],
presets: [
['@babel/preset-env', {
useBuiltIns: 'entry',
corejs: '3'
}]
]
}
index.js
import './polyfill';
import app from './app';
app();
polyfill.js
import 'core-js/stable';
import 'whatwg-fetch';
webpack.config.js
entry: {
bundle: [pathToIndexJs]
}
optimization: {
runtimeChunk: false,
splitChunks: {
cacheGroups: {
commons: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all'
}
}
}
}
我们最终得到的是两个块,bundle
并且vendors
. 奇怪的是whatwg-fetch
(and core-js
) 并没有以一个块的形式结束。当我创建一个构建并输出一个 stats.json 文件并使用Webpack Analyze对其进行分析时,我在模块列表 (./node_modules/whatwg-fetch/fetch.js) 中看到了该模块,但它的块列是空的。我已经通过搜索捆绑代码验证了它不会在任何一个块/捆绑中结束。
如果我将 polyfill 添加到entry.bundle
数组的开头,这个问题就得到了解决,但我想知道为什么它不首先包含在包中,因为它是一个正常的应用程序导入?我希望它出现在vendors
包中,因为它是一个 node_module。
解决方案
如果您使用core-js
,则不必在任何地方添加 core-js。您所要做的就是安装 core-js,创建一个.babelrc
文件并将以下内容放入其中
{
"presets": [
[
"@babel/preset-env",
{
"debug": true,
"useBuiltIns": "usage",
"corejs": 3
}
]
]
}
Dubug 参数准确显示了添加了哪些 polyfils 以及添加了哪些内容。您的代码应如下所示。
index.js
import app from './app';
app();
Webpack 保持原样
更新
我又忘记了一件事,最重要的是你看不到pollyfils。
包.json
"browserslist": [
"last 2 version",
">1%",
"not dead"
],
当然你可以调整想要获取polyffils的浏览器列表-> browserl
编辑vs添加所有 polyfill 和仅添加特定浏览器所需的那些有
什么区别。
编译后的示例文件在使用47KB 后变为 114KB 后!差异是巨大的。"useBuiltIns": "usage"
"useBuiltIns": "entry"
Entry
Usage
7KB
Usage
Entry
推荐阅读
- android - 如何在单击 Android WebView 中存在的按钮时播放 Lottie 动画文件
- javascript - 将主题插入到 styled() 方法中
- spring-boot - Junit测试失败:HttpMessageConversion错误
- visual-studio - 在解决方案中更改 .vb 文件的文件路径 - 连接的东西
- amazon-web-services - 将 Nginx 块隐蔽到 AWS ALB
- node.js - 在 puppeteer 中存储浏览器页面
- mongodb - MongoDB 聚合:如何将刻度转换为日期?
- python - 加载音频文件并找到频率
- ios - WKWebView 在旧项目中显示内容错误的框架
- sql - 从源表中的值列表中识别具有最高值的 FK