Webpack 差分构建
Webpack differential build
我正在尝试为 Web 构建 2 个版本,一个为现代浏览器构建,另一个让旧的 IE 11 满意。
现在我有 webpack 和 babel,并且 webpack 有一个配置数组:
module.exports = [
{
//more config
name: "modern",
module: {
rules: [
{
test: /\.m?js$/,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
options: {
envName: "modern"
}
}
]
}
]
}
},
{
//more config
name: "legacy",
module: {
rules: [
{
test: /\.m?js$/,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
options: {
envName: "legacy"
}
}
]
}
]
}
//more config
}
]
babel 有这个配置
{
"env": {
"modern": {
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3.21,
"modules": false,
"targets": "> 5%, not dead"
}
]
]
},
"legacy": {
"browserslistConfigFile":false,
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3.21,
"modules": false,
"targets": "ie 11",
"ignoreBrowserslistConfig": true
}
]
]
}
}
问题是我无法进行遗留构建。每次它输出一些在 IE 上不起作用的箭头函数。
我看到它采用默认的 browserslist 值,因为如果我在 package.json 中手动将 browserslist 全局设置为 IE,它会输出 IE 有效的 js,但在这种情况下,现代构建没有现代代码。
那么我怎样才能制作真正现代的建筑和旧建筑?
正如我所说,对我来说,问题是 babel 会根据我的选择进行编译,但是 webpack 每次都会选择一个不是 babel 目标的浏览器列表,并至少添加一个 IIFE 箭头函数,所以IE 的输出代码是错误的。
我在 webpack config:
中找到了这一行
target: 'browserslist:legacy',
它指向我在 package.json:
中的浏览器列表环境之一
"browserslist": {
"modern": [
"> 5%",
"not dead"
],
"legacy": [
"ie 11"
]
},
并从 babel 中删除目标:
{
"env": {
"modern": {
"presets": [
[
"@babel/preset-env",
{
"modules": false
}
]
]
},
"legacy": {
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3.21,
"modules": false,
}
]
]
}
}
}
所以 babel 为我的浏览器列表编译,webpack 在开始时添加正确的 IIFE 函数
我正在尝试为 Web 构建 2 个版本,一个为现代浏览器构建,另一个让旧的 IE 11 满意。 现在我有 webpack 和 babel,并且 webpack 有一个配置数组:
module.exports = [
{
//more config
name: "modern",
module: {
rules: [
{
test: /\.m?js$/,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
options: {
envName: "modern"
}
}
]
}
]
}
},
{
//more config
name: "legacy",
module: {
rules: [
{
test: /\.m?js$/,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
options: {
envName: "legacy"
}
}
]
}
]
}
//more config
}
]
babel 有这个配置
{
"env": {
"modern": {
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3.21,
"modules": false,
"targets": "> 5%, not dead"
}
]
]
},
"legacy": {
"browserslistConfigFile":false,
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3.21,
"modules": false,
"targets": "ie 11",
"ignoreBrowserslistConfig": true
}
]
]
}
}
问题是我无法进行遗留构建。每次它输出一些在 IE 上不起作用的箭头函数。 我看到它采用默认的 browserslist 值,因为如果我在 package.json 中手动将 browserslist 全局设置为 IE,它会输出 IE 有效的 js,但在这种情况下,现代构建没有现代代码。
那么我怎样才能制作真正现代的建筑和旧建筑?
正如我所说,对我来说,问题是 babel 会根据我的选择进行编译,但是 webpack 每次都会选择一个不是 babel 目标的浏览器列表,并至少添加一个 IIFE 箭头函数,所以IE 的输出代码是错误的。 我在 webpack config:
中找到了这一行target: 'browserslist:legacy',
它指向我在 package.json:
中的浏览器列表环境之一"browserslist": {
"modern": [
"> 5%",
"not dead"
],
"legacy": [
"ie 11"
]
},
并从 babel 中删除目标:
{
"env": {
"modern": {
"presets": [
[
"@babel/preset-env",
{
"modules": false
}
]
]
},
"legacy": {
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3.21,
"modules": false,
}
]
]
}
}
}
所以 babel 为我的浏览器列表编译,webpack 在开始时添加正确的 IIFE 函数