Vue2引入vue-advanced-chat报Module parse failed错误排查
问题描述
参照官方安装文档安装vue-advanced-chat组件后,即使运行最简单的组件测试用例,也会抛出如下编译错误:
error in ./node_modules/vue-advanced-chat/dist/vue-advanced-chat.common.js Module parse failed: Unexpected token (17025:3) You may need an appropriate loader to handle this file type. | emoji, | skinTone: currentSkinTone, | ...skinTonedUnicode && { unicode: skinTonedUnicode }, | ...emojiSummary.name && { name: emojiSummary.name } | }); @ ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/HelloWorld.vue 10:0-43 @ ./src/components/HelloWorld.vue @ ./src/router/index.js @ ./src/main.js @ multi (webpack)-dev-server/client?http://localhost:8082 webpack/hot/dev-server ./src/main.js
初步判断问题与依赖版本兼容性相关,报错项目的package.json完整配置如下:
{ "name": "vue2-adv-chat", "version": "1.0.0", "description": "A Vue.js project", "author": "Алексей С <whthaker@gmail.com>", "private": true, "scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "build": "node build/build.js" }, "dependencies": { "vue": "^2.5.2", "vue-advanced-chat": "^1.5.5", "vue-router": "^3.0.1" }, "devDependencies": { "autoprefixer": "^7.1.2", "babel-core": "^6.22.1", "babel-helper-vue-jsx-merge-props": "^2.0.3", "babel-loader": "^7.1.1", "babel-plugin-syntax-jsx": "^6.18.0", "babel-plugin-transform-runtime": "^6.22.0", "babel-plugin-transform-vue-jsx": "^3.5.0", "babel-preset-env": "^1.3.2", "babel-preset-stage-2": "^6.22.0", "chalk": "^2.0.1", "copy-webpack-plugin": "^4.0.1", "css-loader": "^0.28.0", "extract-text-webpack-plugin": "^3.0.0", "file-loader": "^1.1.4", "friendly-errors-webpack-plugin": "^1.6.1", "html-webpack-plugin": "^2.30.1", "node-notifier": "^5.1.2", "optimize-css-assets-webpack-plugin": "^3.2.0", "ora": "^1.2.0", "portfinder": "^1.0.13", "postcss-import": "^11.0.0", "postcss-loader": "^2.0.8", "postcss-url": "^7.2.1", "rimraf": "^2.6.0", "semver": "^5.3.0", "shelljs": "^0.7.6", "uglifyjs-webpack-plugin": "^1.1.1", "url-loader": "^0.5.8", "vue-loader": "^13.3.0", "vue-style-loader": "^3.0.1", "vue-template-compiler": "^2.5.2", "webpack": "^3.6.0", "webpack-bundle-analyzer": "^2.9.0", "webpack-dev-server": "^2.9.1", "webpack-merge": "^4.1.0" }, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" }, "browserslist": [ "> 1%", "last 2 versions", "not ie <= 8" ] }
报错原因
报错位置的...skinTonedUnicode && { unicode: skinTonedUnicode }属于ES2018标准的对象条件展开语法,当前项目使用webpack3 + babel6的老旧构建栈,存在两个核心问题:
- 默认配置下babel-loader会直接排除
node_modules目录下的所有文件,不会对第三方依赖做语法降级转译 - 安装的
vue-advanced-chat@1.5.5版本打包产物中包含未转译的高版本ES语法,webpack3原生无法识别该语法,直接抛出模块解析失败错误。
解决方案
两种方案二选一即可,优先选择第一种,改动量最小:
- 方案1:降低组件版本适配现有构建环境
卸载当前安装的高版本组件,安装适配webpack3、Vue2.5.x环境的兼容版本,执行以下命令:npm uninstall vue-advanced-chat npm install vue-advanced-chat@0.8.6 --save - 方案2:修改构建配置转译第三方依赖语法
如果必须使用1.5.5版本的组件,可修改构建配置让babel转译该组件代码,补全对应语法转译能力:- 打开build目录下的
webpack.base.conf.js文件,找到babel-loader的规则配置,修改路径匹配逻辑,将vue-advanced-chat加入babel转译范围,参考配置如下:
{ test: /\.js$/, loader: 'babel-loader', include: [ resolve('src'), resolve('test'), resolve('node_modules/vue-advanced-chat') ] }- 安装支持对象展开语法转译的babel插件:
npm install babel-plugin-transform-object-rest-spread --save-dev- 打开项目根目录的
.babelrc配置文件,在plugins数组中新增刚安装的插件:
{ "presets": [ ["env", { "modules": false }], "stage-2" ], "plugins": [ "transform-runtime", "transform-vue-jsx", "transform-object-rest-spread" ] } - 打开build目录下的
注意:所有操作完成后,必须删除node_modules/.cache目录再重启开发服务,否则babel-loader的缓存会导致旧错误持续出现。
内容的提问来源于stack exchange,提问作者Алексей Стародубцев
相关产品推荐
相关产品推荐

