package.json常用配置:
- name(必填)项目的名称
- version: (必填)当前项目的版本号
- main:入口文件(前端因为有webpack的存在基本上用不到,只是作为发布的时候别人下载下来用的时候的入口文件)
- description: 描述信息
- author:作者信息(发布时用到)
- license:开源协议(发布时用到)
- private:是否为私密(设置为true不可以发布)
- requires:子依赖,也就是这个大的依赖还依赖着其他的包
- resolved:具体的registry下载地址
- integrity:用来从缓存中获取索引,再通过索引去获取压缩文件
例如:axios中还依赖follow-redirects
"axios": {
"version": "0.21.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz",//指定安装的是registry的0.21.0的版本的压缩文件(tgz)
"integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==",//
"requires": {
"follow-redirects": "^1.10.0"
}
},
script:脚本执行
我们都知道执行某个js文件的时候我们通过:node index.js来执行index.js的文件
而我们也可以设置package.json自定义脚本名并通过npm run 来达到相同的效果:
package.json中设置:
"scripts": {
"renameNode": "node index.js"//renameNode就是我们run的指令,value值为我们代替的命令行
},
此时我们输入npm run renameNode:
即可达到node index.js一样的效果
- dependencies:无论是开发环境还是生成环境都需要依赖的包(带有版本号)
"dependencies": {
"element-ui": "^2.13.2",
"vue": "^2.6.11",
"vue-router": "^3.2.0",
"vuex": "^3.4.0"
},
- devDependencies: 一些包是生成环境下不需要的:如webpack,babel等
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-plugin-router": "~4.5.0",
"@vue/cli-plugin-vuex": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"babel-eslint": "^10.1.0",
"babel-plugin-component": "^1.1.1",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"vue-template-compiler": "^2.6.11"
},
我们可以看到vuex版本号为^3.4.0其实这个是根据一个叫semver版本的规范来定义的。X.Y.Z分别对应的是主版本.次版本.修订版本
npm install原理
我们平时打开项目直接npm install的时候其实是根据package.json的开发时依赖和生成环境依赖来安装依赖的
当我们使用npm install的时候,大概流程如下所示:
我们在第一次install的时候:
我们是没有lock.json文件的,此时我们要构建依赖关系,其实就是扁平化我们的依赖。因为很有可能出现比如我们webpack依赖一个叫X的包,而我们axios也依赖X的包,为了避免重复安装X的依赖所以可以采用扁平化的处理来优化。构建完依赖关系之后我们就通过registry仓库下载压缩包。并且按照完后我们会进行对压缩包进行缓存再将其压缩到node_modules文件中。并在此时生成一个叫package-lock.json的文件对后面的再次install做优化。这就是我们会经常看到除了package.json文件,还有一个package-lock.json文件
后续install的时候:
我们会检查是否存在package-lock.json的文件,并且检查依赖是否一致。例如package.json的版本号等等,如果不一致的话我们又得构建依赖关系。如果一致我们就可以直接找缓存了。但是如果没找到我们还是得从registry仓库重新安装依赖并且获取压缩包添加到新的缓存中去。并把压缩包压缩到node_modules中
当我们的依赖包可能出现问题的时候我们可以先清除缓存:npm cache clean再重新install
npm link
#!/user/bin/env node:告诉操作系统执行这个脚本的时候,调用/usr/bin下的node可执行文件(node解释器),也就是说写绝对路径也是可以的。扩展下:bin就是binarary二进制的缩写,里面一般放可执行文件
脚本用env启动的原因,是因为脚本解释器在linux中可能被安装于不同的目录,env可以在系统的PATH目录中查找。同时,env还规定一些系统环境量。 而如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题。
npm link是让package.json里的bin连接到本地环境变量。
使用指令的步骤为:
index.js里:
#!/usr/bin/env node
console.log('test');
package.json里:
"bin": {
"han": "index.js"//告诉可执行命令han的执行文件是index.js
},
最后通过npm link使package.json里的bin连接到本地环境变量。也就是把han作为了终端命令配置到了环境变量里,一旦执行han命令就会在环境变量找到index.js并执行
完事后执行一下: