使用webpack
打包的时候会出现Unexpected token: name
的问题,
是因为在webpack.config.js
中的loaders
过滤了node_modules
,但是有依赖的模块需要进行babel
处理,如下
{
test: /.js[x]?$/,
include: [
path.resolve(__dirname, 'src'),
],
exclude: /node_modules/,
loaders: ['babel-loader', 'eslint-loader']
}
打包时报如下
...
ERROR in js/app.beef0790.js from UglifyJs
Unexpected token: name (result) [js/app....]
...
经过排查分析,是因为依赖的模块中asn1.js
的lib/asn1/base/node.js
使用了let result
语法,只需要修改一下include
和exclude
{
test: /.js[x]?$/,
include: [
path.resolve(__dirname, 'src'),
/asn1/, // fix UglifyJs Unexpected token: name (result)
],
// exclude: /node_modules/,
loaders: ['babel-loader', 'eslint-loader']
}
如果出现其他token
,需要根据token的名称定位到具体的模块。
以下是具体的分析过程。
先搜索
$ cd node_modules
$ grep "Unexpected token:" . -nR
...
./webpack/node_modules/uglify-js/lib/parse.js
找到抛出异常的位置,打印报错文件的上下文
...
console.log('Unexpected context =>', $TEXT.split('\n').slice(token.line - 2, token.endline + 4));
token_error(token, "Unexpected token1: " + token.type + " (" + token.value + ")");
再次执行可以看到报错的上下文代码
Unexpected context => [ '',
' let result = state[\'default\'];',
' let present = true;',
'',
' let prevKey = null;',
' if (state.key !== null)' ]
再根据报错的上下文代码搜索到指定的模块
$ grep "let result = state" . -nR
./asn1.js/lib/asn1/base/node.js:282: let result = state['default'];
定位到是asn1.js
模块有问题,需要进行babel
处理