我想将TerserPlugin用于优化某些代码,并从Terser处理中排除一些第三方库(例如vue),但是我尝试进行的任何测试,包括和排除都行不通。 我的代码是用Typescript(仅* .ts文件而不是.vue文件)和大多数第三方js编写的,以防以后发生问题。
我尝试使用followig正则表达式和字符串进行测试,包括并排除TerserPlugin,如下所示:
1。)未指定测试子句,未排除,不包括:应用了Terser,例如方法的局部变量在我的资料和第三方库中被替换。实际上,这很奇怪,因为根据https://github.com/webpack-contrib/terser-webpack-plugin的test
默认设置为/\.m?js(\?.*)?$/
,这对于任何* .ts文件都是不正确的。因此,我的Typescript文件不应该由Terser处理,但是可以
2。)test: /\.ts$/i
-我的文件或第三方库中没有任何代码转换
3。)include: /\.ts$/i
-我的文件或第三方库中没有任何代码转换
4。)include: /entities/i
-我的文件(夫妇在目录名称实体中)或第三方库中都没有terser转换
5。)exclude: /vue/i
-应用了Terser,例如方法的局部变量在我的资料和第三方库中被替换
6。)exclude: "C:\Repositories\m2\node_modules\vue\dist\vue.esm.js"
-应用了Terser,例如方法的局部变量在我的资料和第三方库中被替换
7。)exclude: "C:/Repositories/m2/node_modules/vue/dist/vue.esm.js"
-应用了Terser,例如方法的局部变量在我的资料和第三方库中被替换
8。)exclude: path.join(__dirname, 'node_modules/vue/dist/vue.esm.js')
-应用了Terser,例如方法的局部变量在我的资料和第三方库中被替换
对我来说这没有任何意义。我输入的任何内容似乎都失败了,例如测试和包含永远不会是真的,因此什么也不会处理,而排除也永远不会是真实的,因此所有事情都将得到处理。对我来说,这似乎是一个巨大的错误-实际上,我无法相信它太大了。有人有想法吗?
在我的webpack配置中,这里是我完整的Terser配置,并标有放置正则表达式的位置
optimization: {
namedModules: true,
chunkIds: 'size',
moduleIds: 'hashed',
removeAvailableModules: true,
removeEmptyChunks: true,
mergeDuplicateChunks: true,
usedExports: true,
minimize: true,
minimizer: [new TerserPlugin({
- place where i put the regex test, exclude condition --
extractComments: false,
sourceMap: false,
terserOptions: {
output: {
comments: true,// to change
beautify: true,// to change
},
ecma: 6,
warnings: true,// to change
parse: {},
mangle: {
eval: true,
// mangle options
keep_classnames: false,
keep_fnames: false,
module: true,
toplevel: true,
safari10: false,
},
nameCache: null,
ie8: false,
}
})],
我的TerserPlugin版本是:“ terser-webpack-plugin”:“ ^ 1.4.1”
如果可能的话,虽然我猜没关系,但这里是我的webpack模块配置:
module: {
rules: [
{ test: /\.vue$/,
exclude: /node_modules/,
loader: 'vue-loader'
},
{ test: /\.ts$/,
exclude: /node_modules|vue\/src/,
loader: "ts-loader"
},
{ test: /\.woff(2)?(\?v=[0-9]+\.[0-9]+\.[0-9]+)?$/,
loader: "url-loader?limit=10000&mimetype=application/font-woff&name=[name].[ext]",
options: {
outputPath: './m2/fonts',
}
},
{ test: /\.(ttf|eot)(\?v=[0-9]+\.[0-9]+\.[0-9]+)?$/,
loader: "file-loader?name=[name].[ext]",
options: {
outputPath: './m2/fonts',
}
},
{ test:/\.sass$/,
use:['style-loader','css-loader', 'sass-loader']
},
{ test:/\.(s*)css$/,
use:['style-loader','css-loader', 'sass-loader']
},
{ test: /\.styl$/,
loader: ['style-loader', 'css-loader', 'stylus-loader']
},
{ test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
},
答案 0 :(得分:1)
我的理解是,Terser
适用于输出块,而不适用于输入文件。
例如,有一个块过滤器选项:https://webpack.js.org/plugins/terser-webpack-plugin/#chunkfilter指出:
允许过滤哪些块应该被丑化(默认情况下所有块都被丑化)。
include/exclude
选项更加模糊。
所以我得出结论,为了不处理供应商脚本-您必须将它们放在单独的缓存组中:https://webpack.js.org/plugins/split-chunks-plugin/#split-chunks-example-3,然后排除该供应商块。
答案 1 :(得分:0)