关于package.json的一些

6 篇文章 0 订阅

文档:

官⽅⽂档: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)的名称。

    命名规范:

  1. 唯一
  2. 名称必须小于或等于214个字符。
  3. 名称不能以下划线或者点开头。
  4. 新包的名称中不能有大写字母。

     version:包版本,对于业务项目来说,这个往往不太重要,但是如果你要发布自己的项目,这个就很重要啦。name和version共       同决定了唯一一份代码。npm是用npm-semver来解析版本号的。npm模块的完整版本号一般是【主版本.次要版本.小版本】,比       如React 16.10.1

  1. 大版本:大的变动,可能影响了向后的兼容性。
  2. 次要版本:增加了新的特性不改变已有的特性。
  3. 小版本:修改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种依赖包管理类型

  1. dependencies: 应用依赖/业务依赖
  2. devDependencies:开发依赖
  3. peerDependencies:同伴依赖
  4. bunledDependencies/bunleDependencies:打包依赖
  5. 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.1\2.2\...\2.9都可以
     'apple':'*'/'', //任意版本
     'peach':'latest', //当前最新
     'day':'file:../day', //本地地址
     'git':'git+http://git@github.com:npm/npm.git#v1.0.27', //git地址
  }
}

主要版本匹配:

  1. 指定版本:比如1.2.2,遵循'大版本、次要版本、小版本'的格式规定,安装时只安装指定版本。
  2. 波浪号+指定版本:比如~1.2.2,表示安装1.2.x的最新版本(不低于1.2.2),但是不安装1.3.x,也就是安装的时候不改变大版本号和次要版本号。
  3. 插入号+指定版本:比如^1.2.2,表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是安装的时候不改变大版本号。需要注意的是,如果大版本号为0,则插入号的行为和波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序上的不兼容。
  4. 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
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值