前言
感觉这块也是一个知识点,尽管我当初还不能零碎的用xmind总结每个知识点的串联关系,然而只能看一个记一个了
package.json是什么
我集体了解,package.json是形容包,治理包的一个信息json文件,给npm用的,比方你能够写一个包,发到npm,那这个json就是记录这个包的信息,或者对用vue脚手架开发的我的项目而言,它就是治理包的文件,npm install会读这个文件的denp配置包信息而后下载
package.json 如何产生的
用npm init初始化,一路回车,这里说一句,npm init,这句话,咱们是用shell窗口输出的,就是在这种
要晓得,这个窗口外面的指令,其实执行的是shell指令,也就是说,npm init,打上来后,它外部跑了一个sehll的指令,这个指令调用零碎创立文本的指令,而后巴拉巴拉,最初输入到本文件夹。
dependenices和devDependenices
这两个字段,从始至终,我只晓得,dependenices的依赖包是本地,线上开发都须要,比方UI框架,而devDependenices的依赖包,只是本地开发才须要,比方eslint;
(1)什么叫本地须要,线上开发须要?
我的了解啊,就是npm run dev的时候,这两个字段的依赖包全副都会加载,而npm run build的时候,devDependenices的依赖包不会打包进去,从而缩小了整个包的体积,拜访更快一点
(2)锁版本
我明天才晓得,原来装置依赖的时候,把包后面的倒三角删掉,版本就锁定了
那么这样做有什么用呢??
你的共事,拉代码,跑npm install的时候,如果依赖包后面带倒三角,它其实是默认拉最新的包,如果它跑完了,代码一推,这个package.json被更新了,重点来了!
依赖A版本是1.0,它匹配依赖B版本是1.0,前面依赖B更新了2.0,你装置依赖的 时候,A还是1,然而B被你更新变成2了,后果就报错了
(3)指令
// 装置最新到dependenices(默认)npm i xxxxx// 装置最新到dependenicesnpm i xxxxx -S// 装置指定版本到dependenicesnpm i xxxxx@2.0.0// 装置最新到devDependenicesnpm i xxxxx -D
bin
在介绍这个字段之前,先来举一个例子,
大家在新的电脑装置环境的时候,装那个node的时候,如果那个node装置后,没有配置PATH(环境变量地址),在shell窗口输出node -v的时候,会报错说找不到,配了path后,其实就是把装置目录门路填进去,就能够
好了说完下面那个之后,回到这个bin,这个bin字段的作用其实也相似。
在咱们的依赖包里,比方gulp,有这个bin字段配置
一旦有这个配置,那么其实咱们装npm i gulp的时候,它会读取到这个字段,并且,会写一份文件到node_modules下的.bin文件夹(这个文件夹的由来就是这样)
而后呢,当咱们npm run dev的时候,都晓得,这句代码,其实跑的是scripts那里的
gulp dev-local,问题来了,gulp我没有全局装置,PATH我没有配,为什么这样跑不会报错!!!
答案就是,上面我引入大佬文章的一段解释
(1) 咱们每次在运行 scripts 中的一个属性时候(npm run),理论零碎都会主动新建一个shell(个别是Bash),在这个shell外面执行指定的脚本命令。因而 但凡能在 shell 中容许的脚本,都能够写在npm scripts中。
(2) 特地的点,npm run 新建的 shell,会在当前目录的 node_modules/.bin 子目录退出到 PATH 变量,执行完结后,再将 PATH 变量复原原样。也就是说,以后我的项目目录 node——modules/.bin 子目录中所有的脚本,都能够间接用脚本名称调用,不须要减少门路.(简略总结:通过 npm 启动的脚本,会默认把 node_modules/.bin 加到 PATH 环境变量中。)
比方原本咱们应该要这样写的
"scripts": { "dev": "./node_modules/.bin/gulp dev-local", "server": "gulp dev-local", "build": "gulp deploy && gulp dev-server" },
然而有这个机制在,就能够
"scripts": { "dev": "gulp dev-local", "server": "gulp dev-local", "build": "gulp deploy && gulp dev-server" },
大家也能够联想到webpack,webpack我没有全局装置,为什么用依赖的模式装置webpack却能够执行,一样的情理
"scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "build": "node build/build.js" },
未完待续
材料参考这位大佬
【Node进阶】你应该晓得的NPM常识都在这!