解决npm install安装了太多架包的问题

安装vue 1.0.28时,执行如下命令,却发现node_modules文件里猛然增加了几十个架包,看起来非常不爽。

#   只安装Vue V1的最新版本
npm install vue@">=1.0.28 < 2.0.0" --save
#   输出目录文件   
ll node_modeles/

执行ll命令后,输出的内容如下:

drwxr-xr-x 1 yiifaa 197609 0 127 16:10 acorn/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 amdefine/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 ast-types/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 balanced-match/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 base62/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 bootstrap/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 brace-expansion/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 commander/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 commoner/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 concat-map/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 defined/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 detective/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 envify/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 esprima-fb/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 font-awesome/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 glob/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 graceful-fs/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 graceful-readlink/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 iconv-lite/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 inflight/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 inherits/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 jqGrid/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 jquery/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 jstransform/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 minimatch/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 minimist/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 mkdirp/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 object-assign/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 once/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 path-is-absolute/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 private/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 q/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 recast/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 require-css/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 requirejs/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 source-map/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 text/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 through/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 vue/
drwxr-xr-x 1 yiifaa 197609 0 127 16:10 wrappy/

对比package.json文件,发现内容增多了几倍,package.json的依赖如下:

"dependencies": {
    "bootstrap": "^3.3.6",
    "font-awesome": "^4.7.0",
    "jqGrid": "^5.1.1",
    "jquery": "^3.1.1",
    "require-css": "^0.1.8",
    "requirejs": "^2.3.2",
    "text": "github:requirejs/text",
    "vue": "^1.0.28"
 }

这些莫名奇妙的acorn、amdefine……是从哪里来的?

查看npm使用文档后,添加参数–only参数,只安装生产版本,发现node_modules目录的结果依旧如此,命令如下。

# --only还可以取值为dev或development,表示还会安装开发依赖
npm install vue@">=1.0.28 < 2.0.0" --save --only=production

继续翻阅npm使用文档,发现文档里有一段这样的话

dependencies will be added as close to the top as is possible without breaking any other modules

原来如此!NPM从3.0.0开始,架包的依赖不再安装在每个架包的node_modules文件夹内,而是安装在顶层的node_modules文件夹中。如果要启用之前的风格,则可以添加命令参数legacy-bundling,如下:

#   清空node_modules文件后,重新执行命令
npm install vue@">=1.0.28 < 2.0.0" --legacy-bundling

再次运行”ll node_modeles/”,发现架包已经干净清澈了很多,与package.json完全呼应上了,如下:

drwxr-xr-x 1 yiifaa 197609 0 127 15:53 bootstrap/
drwxr-xr-x 1 yiifaa 197609 0 127 15:53 font-awesome/
drwxr-xr-x 1 yiifaa 197609 0 127 15:53 jqGrid/
drwxr-xr-x 1 yiifaa 197609 0 127 15:53 jquery/
drwxr-xr-x 1 yiifaa 197609 0 127 15:53 require-css/
drwxr-xr-x 1 yiifaa 197609 0 127 15:53 requirejs/
drwxr-xr-x 1 yiifaa 197609 0 127 15:53 text/
drwxr-xr-x 1 yiifaa 197609 0 127 15:53 vue/

结论

执行npm install后,造成node_modules文件夹中出现了太多架包,并非是命令执行错误或者是环境的问题,而是npm升级导致的规范变更。

脑中突然浮现一个问号,npm官方为何不将这些依赖全部存入一个固定的文件夹,例如dependence,这样既能保证所有库包的版本兼容性,又能保证node_modules的干净性?

你可能感兴趣的:(项目构建)