问题
项目启动后异常日志
./node_modules/@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.js 1:4153 Module parse failed: Unexpected token (1:4153) You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders ... | //# sourceMappingURL=leaflet-geoman.js.map | @ ./src/hook/leafletjs/drawTools.js 3:0-40 @ ./node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader-v16/dist??ref--1-1!./src/views/snzw/patrolMap/index.vue?vue&type=script&setup=true&lang=js @ ./src/views/snzw/patrolMap/index.vue?vue&type=script&setup=true&lang=js @ ./src/views/snzw/patrolMap/index.vue @ ./src/router/index.ts @ ./src/main.ts @ multi (webpack)-dev-server/client?http://192.168.0.10:8010&sockPath=/sockjs-node (webpack)/hot/dev-server.js ./src/main.ts
问题分析
日志指出 /src/hook/leafletjs/drawTools.js
文件内部出现错误,查看该文件
可以看引入该包引起的错误,由编译失败的日志可以看出 @geoman-io/leaflet-geoman-free
包内 1:4153
位置出现错误,日志标注为 webpack loader
无法正常处理该文件,看一下错误具体位置.
结论
根据错误位置可以得出,该包内部使用了 ECMA2020 的链式语法,该语法无法正常被解析。正常情况项目中的 js 文件会被 babel-loader
解析,但是该文件是 node_modules
中的,所以 vue-cli
项目内的 babel-loader
会默认忽略该目录中的文件不进行编译(请查阅 vue-cli 文档)。
解决
将
@geoman-io/leaflet-geoman-free
加入到 babel-loader 中编译
在 vue.config.js 中配置transpileDependencies
# vue.config.js module.exports = { transpileDependencies: ["@geoman-io/leaflet-geoman-free"] }
查看
@geoman-io/leaflet-geoman-free
官方的issues
查阅到有人遇到了类似的问题,在 2.16.0
版本内官方确实使用了新的语法 (github.com/geoman-io/l…),给出方案是使用 import "@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.min.js"
min 文件;因为我们使用的是最新版本,引用后问题依旧无法解决(固定版本至2.14.2
后也可以解决)
最后
我们经常在项目的开发过程中,前期未固定npm
包的版本,后期项目重新安装包后,出现包版本小版本升级,导致项目出现了一些不可控的问题,因此在开发项目过程中,尽量固定开发中的包版本。