概述
文档:
官⽅⽂档:https://docs.npmjs.com/files/package.json.html
什么是package.json?
- 在node.js中,有模块的概念,这个模块可以是一个库、框架、项目等。这个模块的描述文件就是package.json。
- 它是一个标准的json对象,描述了这个项目的配置信息(名称,版本,许可证等元数据)以及所需要的各个模块。
- npm install命令会根据这个配置文件,自动下载依赖的模块,配置运行和开发的环境。
创建案例代码
1.创建一个项目目录
mkdir package-test && cd package-test
2.初始化package.json文件
npm init -y
3.package.json文件生成
{
'name':'package-test',
'version':'1.0.0',
'description':'17号特工用来学习package的项目',
'main':'index.js',
'script':{
'test':'echo 'Error:no test specified' && exit 1'
}
'keywords':[],
'author':'Six tegong',
'license':'ISC'
}
package的核心字段(元数据)
name:包的名称,发布到npm平台上显示的名称,业务引入是require(name)的名称。
命名规范:
- 唯一
- 名称必须小于或等于214个字符。
- 名称不能以下划线或者点开头。
- 新包的名称中不能有大写字母。
version:包版本,对于业务项目来说,这个往往不太重要,但是如果你要发布自己的项目,这个就很重要啦。name和version共 同决定了唯一一份代码。npm是用npm-semver来解析版本号的。npm模块的完整版本号一般是【主版本.次要版本.小版本】,比 如React 16.10.1
- 大版本:大的变动,可能影响了向后的兼容性。
- 次要版本:增加了新的特性不改变已有的特性。
- 小版本:修改bug或其他小的改动。
preferGlobal:它的值是布尔值,表示当用户不将该模块安装为全局模块的时候,要不要显示提示,表示该模块的本意就是安装为 全局模块。
description:包的描述,字符串格式,发布包之后,用户在npmjs.com使用搜索,在结果列表里面发现你的包和对应的描述。
keywords:字段是一个字符串数组,其作用和描述相似。npm注册表会为该字段建立索引,能够在有人搜索软件包时帮助找到它 们。数组的每个值都与你的程序包关联的一个关键字。
author:项目的作者。可以为字符串,对象。只供一个人使用。
contributors:项目的贡献者。
"author": "sixTeGong@example.com https://www.six.com/",
"contributors": [{
"name": "sixTeGong",
"email": "example@example.com",
"url": "https://www.sixTeGong.com/"
}]
homeage:主页信息,一个表示项目首页的url。
bugs: 一个表示接收问题反馈的url地址,也可以是email地址。一般是Github项目下的issues
'bugs':{
'url':'http://path/to/bug',
'email':'bug.com'
}
repository:指明你的项目源代码仓库所在的位置,这有助于其他人为你的项目贡献代码,如果你的项目是托管在github上面,那 么npm docs命令是能够找到的。对于组件库很有用,这个配置项会直接在组件库的npm首页生效。
'respository':{
'type':'git',
'url':'githttps://github.com/xxxxxxcx'
}
files:数组。表示代码包下载安装完成时包含的所有文件。作用和gitignore类似,只不过是反过来的,如果要包含所有的文件可使 用[*]表示。
'files':[
'index.js',
'createReactApp.js',
'yarn.lock.cached'
]
private:如果设为true,无法通过npm publish发布代码。
engines:指定项目所依赖的node环境和npm版本等。
'engines':{
'node':'>=8',
'npm':'>=4.0.0'
}
main:项目的主要入口,启动项目的文件,可以指定项目的主要入口,用户安装使用,require()就能返回主要入口文件的export module.exports暴露的对象。
'main': 'index.js'
license:包的许可证,根据许可证的类型,用户知道如何使用它,有哪些限制。
'license':'ISC'
ISC许可证
'license':'MIT'
MIT许可证
//不想开源
'license':'UNLICENSEED'
如果你不想提供许可证,或者明确不想授予使用私有或未发布的软件包的权限,则可以将UNLICENSED作为许可证,或者设置{'private':true}
依赖包管理
npm目前支持5种依赖包管理类型
- dependencies: 应用依赖/业务依赖
- devDependencies:开发依赖
- peerDependencies:同伴依赖
- bunledDependencies/bunleDependencies:打包依赖
- optionalDependencies:可选依赖
我们平常用的依赖是dependencies和devDependencies,剩下三种依赖有发布包到平台的需求才会使用得到。
dependencies:业务依赖
- 列出项目中使用的所有依赖项。
- 使用npm CLI安装软件包时,它将下载到你的node——modules/文件夹中,并将一个条目添加到你的依赖项属性中
- 用于指定应用依赖的外部包,一些依赖是应用发布上线后,正常执行所需要的。意思就是这些依赖项应该是线上代码的哟部分。所以我们在装包的时候一定要考虑这个包在线上是否用的到,不要全部都放到dependencies中,增加我们打包的体积和效率。
通过以下指令安装依赖会放在dependencies里面
npm i packageName --save
npm i packageName -S
npm install packageName --save
npm install packageName -S
npm i packageName
// npm 5.X版本不需要-S/--save指令就会把依赖添加到dependencies中去
如果没有指定的版本,直接写一个包的名字,则安装当前npm仓库这个包的最新的版本。如果要指定版本,可以把版本号写在包的名字的后面,比如npm i react@16.12.0 -S
在依赖版本中看得到的插入符号(^)和波浪号(~)是semVer中定义版本范围的表示法
{
'dependencies':{
'cat':'1.0.0-3.0.0', //指定版本范围
'pig':'2.9.8', //指定版本
'as':'http://as.com/hah.tar.gz',//指定包地址
'til':'~1.2.3', //最近可用版本
'elf':'^1.2.3', //兼容版本
'one':'2.x', //2.12.2...2.9都可以
'apple':'*'/'', //任意版本
'peach':'latest', //当前最新
'day':'file:../day', //本地地址
'git':'git+http://git@github.com:npm/npm.git#v1.0.27', //git地址
}
}
主要版本匹配:
- 指定版本:比如1.2.2,遵循'大版本、次要版本、小版本'的格式规定,安装时只安装指定版本。
- 波浪号+指定版本:比如~1.2.2,表示安装1.2.x的最新版本(不低于1.2.2),但是不安装1.3.x,也就是安装的时候不改变大版本号和次要版本号。
- 插入号+指定版本:比如^1.2.2,表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是安装的时候不改变大版本号。需要注意的是,如果大版本号为0,则插入号的行为和波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序上的不兼容。
- latest:安装最新版本。
devDependencies:开发依赖
项目在开发时需要的依赖,不应该是线上代码的一部分。通常是单元测试或者打包工具等。
通过以下指令安装依赖会放在devDependencies
npm i packageName --save--dev
npm i packageName -D
npm install packageName --save--dev
npm install packageName -D
dependencies和devDependencies在本质上没什么差别,只是单纯的一个规范作用。执行npm install时两个依赖都会下载到本地。
peerDependencies:同等/同伴依赖
这种依赖的作用是提示宿主环境去安装插件在peerDependencies中所指定依赖的包,最终解决插件与所依赖包不一致的问题。比如说element-ui@2.6.3只是提供一套基于vue和ui组件库,但是它要求宿主环境要安装指定的vue版本,所以你可以看到element项目中的package.json中具有一项配置
'peerDependencies':{
'vue':'^2.5.16'
}
它要求宿主环境安装3.0.0》vue@》=2.5.16的版本,也就是element-ui的运行依赖宿主环境提供的版本范围的vue依赖包。
bundledDependencies/bundleDependencies:打包依赖
这种依赖跟npm pack打包命令有关。假设package.json中有如下配置:
{
'name':'font-end',
'version':'1.0.0',
'dependencies':{
'fe1':'^0.3.2'
},
'devDependencies':{
'fe2':'^1.0.0'
},
'bundledDependencies':[
'fe1',
'fe2'
]
}
执行打包命令npm pack会生成front-end-1.0.0.tgz压缩包,并且该压缩包里含有fe1和fe2两个安装包,这样使用者执行npm install front-end-1.0.0.tgz也会安装这两个依赖。
在bundledDependencies中指定的依赖包,必须先在dependencies和devdependencies声明过,否则打包会报错。
optionalDependencies:可选依赖
这种依赖中的依赖项即使安装失败了,也不影响整个安装的过程。需要注意的是,如果一个依赖同事出现在dpendencies和optionalDependencies中,那么optionalDependencies会获得最高优先级,可能会造成一些预期之外的效果,所以尽量避免这种情况发生。
scripts:执行脚本
scripts是npm cli用来运行项目任务的强大工具。它们可以完成开发过程中的大多数任务,指定运行脚本命令的npm命令行缩写。
"scripts": {
"build": "cd packages/react-scripts && node
bin/react-scripts.js build",
"changelog": "lerna-changelog",
"create-react-app": "node tasks/cra.js",
"e2e": "tasks/e2e-simple.sh",
"e2e:docker": "tasks/local-test.sh",
"postinstall": "cd packages/react-error-overlay/ &&
yarn build:prod",
"publish": "tasks/publish.sh",
"start": "cd packages/react-scripts && node
bin/react-scripts.js start",
"test": "cd packages/react-scripts && node
bin/react-scripts.js test",
"format": "prettier --trailing-comma es5 --singlequote --write 'packages/*/*.js' 'packages/*/!
(node_modules)/**/*.js'",
"dev": "rimraf "config/.conf.json" && rimraf
"src/next.config.js",
"clean": "rimraf ./dist && mkdir dist",
"prebuild": "npm run clean",
"build:test": "cross-env NODE_ENV=production
webpack"
}
npm脚本的原理非常简单。每当执行npm run就会自定新建一个shell,在这个shell里面执行的脚本命令。因此,只要是shell可以运行的命令,就可以写在npm脚本里面。
自定义脚本
我们最常用的npm start,npm run dev......这些脚本都是用户自己定义的,只用在scripts中写相应的shell脚本,可以快速的帮助我们编写打包,启动脚本
"scripts": {
"build": "webpack --config build.js",
"start": "node index.js",
"test": "tap test/*.js"
}
然后我们就可以使用npm run ${name}来执行对应的脚本。
npm run新建的这个shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。
例如执行tap命令,可以直接写
'scripts':{'test':'tap test/*.js'}
而不是
'scripts':'node_modules/.bin/tap test/*.js'
常用脚本命令
"clean": "rimraf dist/*", // 删除目录
"serve": "http-server -p 9090 dist/", // 本地搭建一个http服务
"open:dev": "opener http://localhost:9090", // 打开浏览器
"livereload": "live-reload --port 9091 dist/", // 实时刷新
"build:html": "jade index.jade > dist/index.html", // 构建html文件
"watch:css": "watch 'npm run build:css' assets/styles/",// 只要 CSS ⽂件有变动,就重新执⾏构建
"watch:html" : "watch 'npm run build:html' assets/html" , // 只要 HTML ⽂件有变动,就重新执⾏构建"build:favicon" : "node scripts/favicon.js" , // 构建 favicon
最后
以上就是怕孤单黑猫为你收集整理的关于package.json的一些的全部内容,希望文章能够帮你解决关于package.json的一些所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复