Node03 package.json

1 概述

每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。pm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。

命令提示符执行npm install,则会根据package.json下载所有需要的包,npm install --production只下载dependencies节点的包

一个完整的package.json文件实例如下:

{
  "name": "Hello World",
  "version": "0.0.1",
  "author": "张三",
  "description": "第一个node.js程序",
  "keywords": ["node.js", "javascript"],
  "repository": {
    "type": "git",
    "url": "https://path/to/url"
  },
  "license": "MIT",
  "engines": {
    "node": "0.10.x"
  },
  "bugs": {
    "url": "http://path/to/bug",
    "email": "[email protected]"
  },
  "contributors": [{
    "name": "李四",
    "email": "[email protected]"
  }],
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "latest",
    "mongoose": "~3.8.3",
    "handlebars-runtime": "~1.0.12",
    "express3-handlebars": "~0.5.0",
    "MD5": "~1.2.0"
  },
  "devDependencies": {
    "bower": "~1.2.8",
    "grunt": "~0.4.1",
    "grunt-contrib-concat": "~0.3.0",
    "grunt-contrib-jshint": "~0.7.2",
    "grunt-contrib-uglify": "~0.2.7",
    "grunt-contrib-clean": "~0.5.0",
    "browserify": "2.36.1",
    "grunt-browserify": "~1.3.0",
  }
}

在package.json中可以使用通配符:

"lint": "jshint *.js"
"lint": "jshint **/*.js"

*表示任意文件名,**表示任意一层子目录

2 name字段

name字段不能含有._,可以使用-,不能含有非URL安全的字符

非URL安全的字符

3 scripts字段

scripts字段指定了运行脚本命令时的npm命令缩写,比如start指定了运行npm run start时要执行的命令

注意的是当运行teststartrestartstop命令时可以省略run

npm脚本中需要执行多个任务时,如果是并行执行,使用&符号:

$ npm run script1.js & npm run script2.js

如果是继发执行,使用&&符号:

$ npm run script1.js && npm run script2.js

更多的细节参考阮一峰的文章

4 dependencies字段和devDependencies字段

4.1 使用

dependencies字段指定了项目运行所依赖的模块,devDependencies指定项目开发所需要的模块。

它们都指向一个对象。该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。

{
  "devDependencies": {
    "browserify": "~13.0.0",
    "karma-browserify": "~5.0.1"
  }
}

在单独安装某个模块时:

  • 使用--save表示将该模块写入dependencies属性。缩写为-S
  • 使用--save-dve表示将该模块写入devDependencies属性。缩写为-D

4.2 版本号

版本号 major.minor.patch :其中:

  • patch:修复bug,兼容老版本,
  • minor:新增功能,兼容老版本
  • major:新的架构调整,不兼容老版本

常用的主要有以下几种:

  • 指定版本:比如1.2.2
  • 波浪号(~):表示安装1.2.x的最新版本
  • 插入号(^):表示安装1.x.x的最新版本,注意如果大版本号是0,则与波浪号使用相同,例如^0.2.3只会安装0.2.x的版本,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。
  • latest:安装最新版本

推荐的做法:不锁版本,用 ^ 引入。

在package.json中确定版本号,只能锁定本身依赖的包,但是包自身所依赖的包没有办法锁定,解决方法就是npm shrinkwrap或者npm 5.0版本以后增加的lock功能:

  • 如果你使用 lock 机制,则应该将 package-lock.json 提交到 repo 中。比如 Vue 采取了该策略。
  • 如果你不使用 lock 机制,则应该加入 .npmrc 文件,内容为package-lock=false ,并提交到 repo 中。比如 ESLint 采取了该策略。

4.3 区别

在做项目的时候,两者可以认为没有实质的区别,但是在发布npm包的时候二者区别很大:dependencies下的模块会作为依赖,一起被下载;devDependencies下面的模块就不会自动下载了

一般来说,开发时依赖的东西需要安装在devDependencies字段中,比如转义用的babel,打包用的webpack等,如果发布后还需要使用的则要安装在dependencies,比如vuevue-router

5 main字段

main字段指定了加载的入口文件,require('moduleName')就会加载这个文件。这个字段的默认值是模块根目录下面的index.js

6 cinfig字段

用于添加命令行的环境变量,例如:

{
  "name" : "foo",
  "config" : { "port" : "8080" },
  "scripts" : { "start" : "node server.js" }
}

然后,在server.js脚本就可以引用config字段的值。

http
  .createServer(...)
  .listen(process.env.npm_package_config_port)

用户可以改变这个值。

$ npm config set foo:port 80

7 keywordsdescription字段

description是字符串,keywords是字符串数组,简单地说,这两个东东是npm搜索系统中的搜索条件,所以。如果你试图发布的是一个开源插件,那么这两个字段你应该重视

8 license 字段

指定的项目的许可证,它告诉他人他们是否有权利使用你的包,以及,在使用你的包的时候他们应该受到怎样的限制

license

9 author字段

可以是一个字符串,也可以是一个对象。如果传入对象,要包含三个属性:

  • name属性(必填)
  • email属性(选填)
  • URL属性(选填)

10 engines字段

指明了该模块运行的平台,比如Node的某个版本或者浏览器

{ "engines" : { "node" : ">=0.10.3 <0.12" } }

也可以指定适用的npm版本。

{ "engines" : { "npm" : "~1.0.20" } }

参考

猜你喜欢

转载自blog.csdn.net/duola8789/article/details/80938485
今日推荐