记一次npm错误排查过程

远子 â€¢  2021å¹´05月10日

背景:

最近公司里的新项目升级到了 vue3,项目中使用到了 @vue/cli-service@4.5.12 的版本。

在本机开发过程中一切正常,但是通过公司的部署系统打包的服务器的时候,抛出了如下错误:

$ npm run serve
> vue3-npm6.4.1@0.1.0 serve /Users/rmlzy/Documents/mygithub/vue3-npm6.4.1
> vue-cli-service serve

 INFO  Starting development server...
 ERROR  Error: Cannot find module 'vue-loader-v16/package.json'
Error: Cannot find module 'vue-loader-v16/package.json'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at api.chainWebpack.webpackConfig (/Users/rmlzy/Documents/mygithub/vue3-npm6.4.1/node_modules/@vue/cli-service/lib/config/base.js:114:23)
    at webpackChainFns.forEach.fn (/Users/rmlzy/Documents/mygithub/vue3-npm6.4.1/node_modules/@vue/cli-service/lib/Service.js:236:40)
    at Array.forEach (<anonymous>)
    at Service.resolveChainableWebpackConfig (/Users/rmlzy/Documents/mygithub/vue3-npm6.4.1/node_modules/@vue/cli-service/lib/Service.js:236:26)
    at Service.resolveWebpackConfig (/Users/rmlzy/Documents/mygithub/vue3-npm6.4.1/node_modules/@vue/cli-service/lib/Service.js:240:48)
    at PluginAPI.resolveWebpackConfig (/Users/rmlzy/Documents/mygithub/vue3-npm6.4.1/node_modules/@vue/cli-service/lib/PluginAPI.js:132:25)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! vue3-npm6.4.1@0.1.0 serve: `vue-cli-service serve`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the vue3-npm6.4.1@0.1.0 serve script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/rmlzy/.npm/_logs/2021-05-11T07_21_37_584Z-debug.log

经过 4 个小时的排查后发现,在 @vue/cli-service 中使用了 npm 别名的方式设置包版本:

"optionalDependencies": {
    "vue-loader-v16": "npm:vue-loader@^16.1.0"
}

这种别名的写法要求 npm 的版本在 v6.9 以上,而打包系统的服务器的 npm 版本是 v6.4.1,我本机的 node 始终用的 LTS 版本,目前是 6.14.12。

因此在开发环境正常,但在打包系统的服务器上,低版本的 npm 会忽略别名写法的依赖包,造成依赖包安装错误。

解决办法也很简单,升级一下打包系统的 node 版本即可。

(完)