node项目package.json
示例(mercury-parser package.json):
{
"name": "@postlight/mercury-parser",
"version": "2.2.0",
"description": "Mercury transforms web pages into clean text. Publishers and programmers use it to make the web make sense, and readers use it to read any web article comfortably.",
"author": "Postlight <mercury@postlight.com>",
"homepage": "https://mercury.postlight.com",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/postlight/mercury-parser.git"
},
"bugs": {
"url": "https://github.com/postlight/mercury-parser/issues"
},
"keywords": [
"mercury",
"parser",
"reader",
"web",
"content"
],
"files": [
"dist",
"cli.js",
"src/shims/"
],
"main": "./dist/mercury.js",
"bin": {
"mercury-parser": "./cli.js"
},
"scripts": {
"lint": "eslint . --fix",
"lint:ci": "remark . && eslint .",
"lint-fix-quiet": "eslint --fix --quiet",
"build": "yarn lint && rollup -c && yarn test:build",
"build:ci": "rollup -c && yarn test:build",
"build:web": "yarn lint && rollup -c rollup.config.web.js && yarn test:build:web",
"build:web:ci": "rollup -c rollup.config.web.js && yarn test:build:web",
"release": "yarn build && yarn build:web",
"build:generator": "rollup -c scripts/rollup.config.js",
"test_build": "rollup -c",
"test": "yarn test:node && yarn test:web",
"test:node": "jest --json --outputFile test-output.json",
"test:web": "node ./node_modules/karma/bin/karma start karma.conf.js --auto-watch",
"test:build": "cd ./scripts && jest check-build.test.js",
"test:build:web": "node ./scripts/proxy-browser-test.js",
"watch:test": "jest --watch",
"generate-parser": "node ./dist/generate-custom-parser.js"
},
"engines": {
"node": ">=8.10"
},
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/plugin-transform-runtime": "^7.0.0",
"@babel/polyfill": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"@babel/runtime": "^7.0.0",
"@jesses/circle-github-bot": "^2.1.0",
"@octokit/rest": "^16.9.0",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.0.1",
"babel-jest": "^23.4.2",
"babel-plugin-module-alias": "^1.6.0",
"babel-plugin-module-resolver": "^3.1.2",
"babelify": "^10.0.0",
"babelrc-rollup": "^3.0.0",
"brfs": "^2.0.1",
"brfs-babel": "^2.0.0",
"browserify": "^16.2.3",
"changelog-maker": "^2.3.0",
"eslint": "^5.12.0",
"eslint-config-airbnb": "^17.1.0",
"eslint-config-prettier": "^6.1.0",
"eslint-import-resolver-babel-module": "^2.2.1",
"eslint-plugin-babel": "^5.3.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-jsx-a11y": "^6.1.2",
"eslint-plugin-react": "^7.12.3",
"express": "^4.16.4",
"husky": "^3.0.0",
"inquirer": "^7.0.0",
"jasmine-core": "^2.5.2",
"jest": "^23.6.0",
"jest-cli": "^23.6.0",
"karma": "^3.1.4",
"karma-browserify": "^6.0.0",
"karma-chrome-launcher": "^3.0.0",
"karma-cli": "^2.0.0",
"karma-jasmine": "^1.0.2",
"karma-mocha": "^1.3.0",
"karma-requirejs": "^1.1.0",
"lint-staged": "^8.1.0",
"mocha": "^6.0.0",
"nock": "^10.0.6",
"ora": "^3.0.0",
"prettier": "^1.15.3",
"remark-cli": "^7.0.0",
"remark-lint": "^6.0.4",
"remark-preset-lint-recommended": "^3.0.2",
"requirejs": "^2.3.6",
"rollup": "^1.1.0",
"rollup-plugin-babel": "^4.0.1",
"rollup-plugin-commonjs": "^9.2.0",
"rollup-plugin-node-globals": "^1.4.0",
"rollup-plugin-node-resolve": "^2.0.0",
"rollup-plugin-uglify": "^6.0.1",
"watchify": "^3.11.1"
},
"dependencies": {
"@babel/runtime-corejs2": "^7.2.0",
"@postlight/ci-failed-test-reporter": "^1.0",
"browser-request": "github:postlight/browser-request#feat-add-headers-to-response",
"cheerio": "^0.22.0",
"difflib": "github:postlight/difflib.js",
"ellipsize": "0.1.0",
"iconv-lite": "0.5.0",
"jquery": "^3.4.1",
"moment": "^2.23.0",
"moment-parseformat": "3.0.0",
"moment-timezone": "0.5.26",
"postman-request": "^2.88.1-postman.7.1",
"request-promise": "^4.2.2",
"string-direction": "^0.1.2",
"turndown": "^5.0.3",
"url": "^0.11.0",
"valid-url": "^1.0.9",
"wuzzy": "^0.1.4",
"yargs-parser": "^13.0.0"
},
"bundleDependencies": [
"jquery",
"moment-timezone",
"browser-request"
],
"browser": {
"main": "./dist/mercury.web.js",
"cheerio": "./src/shims/cheerio-query",
"jquery": "./node_modules/jquery/dist/jquery.min.js",
"postman-request": "browser-request",
"iconv-lite": "./src/shims/iconv-lite",
"moment-timezone": "./node_modules/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.js": [
"eslint --fix",
"prettier --write",
"git add"
],
"*.{json,css,md}": [
"remark .",
"prettier --write",
"git add"
]
},
"greenkeeper": {
"ignore": [
"jasmine-core",
"karma-jasmine",
"rollup-plugin-node-resolve",
"eslint-import-resolver-babel-module",
"jest",
"jest-cli",
"babel-jest",
"karma"
]
},
"__npminstall_done": "Tue Jun 30 2020 11:36:49 GMT+0800 (GMT+08:00)",
"_from": "@postlight/mercury-parser@2.2.0",
"_resolved": "https://registry.npm.taobao.org/@postlight/mercury-parser/download/@postlight/mercury-parser-2.2.0.tgz"
}
介绍
package.json 是npm init命令初始化后,在项目的根目录下自动生成的配置文件,它定义了这个项目的配置信息(比如名称、版本、许可证等元数据)以及所需要的各种模块。npm install
命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
字段含义
1.name
package的名称。不过需要注意的是,name有长度限制(虽然一般都不会超),而且name不能以 【点】 或者 【下划线】开头,name中不能有大写字母。这个是每一个package必须的。在业务代码中,通过require(${name})就可以引入对应的程序包了。
2.version
package的版本。对于业务项目来说,这个往往不太重要,但是如果你要发布自己的项目,这个就显得十分重要了。name和version共同决定了唯一一份代码。npm是用[npm-semver来解析版本号的。我们一般见到的都是大版本.次要版本.小版本这种版本号,比如16.1.0。
3.description
包的描述。开发组件库时必需,简明的向库的使用者介绍这个库是干嘛的。对于公司的业务项目,这个配置项一般无所谓。
4.author
项目的作者。可以为字符串,对象。
5.homepage
项目主页。对于开发组件库来说挺有用的。
6.license
开源协议。对于开源组件库,这个十分重要。
7.repository
对于组件库很有用。让组件库使用者找到你的代码库地址。这个配置项会直接在组件库的npm首页生效
8.bugs
开发者的联系方式,代码库的issues地址等。如果代码使用者发现了bug,可以通过这个配置项找到提bug的地方。
9.keywords
关键词。一个字符串数组,对这个npm包的介绍。组件库必需,便于使用者在npm中搜索。对于公司业务项目,这个配置一般无所谓。
10.files
数组。表示代码包下载安装完成时包括的所有文件。
11.main
代码入口。这个十分重要,特别是对于组件库。当你想在node_modules中修改你使用的某个组件库的代码时,首先在node_modules中找到这个组件库,第一眼就是要看这个main,找到组件库的入口文件。在这个入口文件中再去修改代码吧。
browser 环境和 node 环境均可使用。
模块引入方法require()在引入包时,会优先检查这个字段,并将其作为包中其余模块的入口。如果不存在这个字段,require()方法会查找包目录下的 index.js , index.node , index.json 文件作为默认入口。
12.bin
用来指定各个内部命令对应的可执行文件的路径。
一些包作者希望包可以作为命令行工具使用。配置好bin字段后,通过npm install package_name -g
命令可以将脚本添加到执行路径中,之后可以在命令行中直接执行。通过-g命令安装的模块包称为全局模式。
13.scripts
指定了运行脚本命令的npm命令行缩写。十分重要。
脚本说明对象。它主要被包管理器用来安装,编译,测试和卸载包。
a.代码示例:
"scripts": {
"dev": "NODE_ENV=dev webpack-dev-server --progress --hot --host 0.0.0.0 --port 8089",
"test": "NODE_ENV=test webpack --config webpack.test.config.js --progress",
"online": "NODE_ENV=production webpack --config webpack.online.config.js --progress",
"build": "webpack",
"node": "node server.js"
},
b.具体解释:
在命令行输入:npm run dev , 对应的命令就会被执行。这里有一个地方需要注意,当执行npm run xxx 的时候,node_modules/.bin/目录会在运行时被加入系统的PATH变量。
上面的例子,当我们在命令行输入:npm run build时,其实真正执行的命令是node_modules/.bin/webpack而不是webpack。所以,当你的webpack并未全局安装时,直接在命令行输入:webpack是会报错的。因为你的webapck是安装在node_modules/.bin/下面的。
14.engines
指定项目所依赖的node环境、npm版本等。
15.devDependencies
项目的依赖。通过npm run install --save-dev安装的包会出现在这里。主要是在开发过程中依赖的一些工具。用法与dependencies相似
16.dependencies
项目的依赖。通过npm install --save安装的包会出现在这里。注意,不要把测试工具、代码转换器或者打包工具等放在这里。当你在命令行里面使用npm install react --save时,react就会出现在dependencies。默认是安装最新的版本。如果想安装某个特定的版本,可以npm install react@15.6.2。
a.以下的dependencies,格式都是合法的:
"dependencies" : {
"foo" : "1.0.0 - 2.9999.9999",
"bar" : ">=1.0.2 <2.1.2",
"baz" : ">1.0.2 <=2.3.4",
"boo" : "2.0.1",
"qux" : "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
"asd" : "http://asdf.com/asdf.tar.gz",
"til" : "~1.2",
"elf" : "~1.2.3",
"two" : "2.x",
"thr" : "3.3.x",
"lat" : "latest",
"dyl" : "file:../dyl"
}
b.常见的dependencies:
"dependencies": {
"foo": "1.0.0", // 指定了就是1.0.0版本
"bar": "~1.2.2", // 安装版本号不低于1.2.2的1.2.x的最新版本,例如:1.2.3, 1.2.4等等。1.2.1 ,1.3.x 等就不行了
"baz": "ˆ1.2.2", // 安装版本号不低于1.2.2的1.x.x的最新版本,例如: 1.2.7,1.3.1,1.7.8等。1.2.1 ,2.0.0 等就不行了。注意,如果配置是^0.x.x,则和~0.x.x的效果一样。
"lat": "latest" // 安装最新版本
}
c.dependencies 还可以像下面这样配置:
"dependencies": {
"foo": "git+ssh://git@github.com:foo/foo.git#v1.0.1",
}
foo组件的地址为git+ssh://{foo代码库的ssh地址}#v{foo的版本号}
这样的配置在下面这种场景十分有用:
dependencies还有其他的配置方式:组内的许多项目都有同一个功能,把这个功能抽出来做成组件是很自然的想法。但是每个项目都有自己的代码库,公司也没有内部的npm库,组件应该放在哪里呢?可以专门为组件新建一个代码仓库,将组件放在这里开发、迭代。这样,各个项目都可以引用该组件:只需要在dependencies中将组件配置成上述的形式。至于组件的版本,可以通过git tag来控制。
17.bundleDependencies
数组,打包时的依赖。如果配置了bundledDependencies,在项目中执行 npm pack将项目打包时,最后生成的.tgz包中,会包含bundledDependencies中配置的依赖。bundledDependencies中的依赖必须在devDependencies或者dependencies中声明过。
18.browser
定义 npm 包在 browser 环境下的入口文件。
19.husky
husky
其实就是一个为 git
客户端增加 hook 的工具。将其安装到所在仓库的过程中它会自动在 .git/
目录下增加相应的钩子实现在 pre-commit
阶段就执行一系列流程保证每一个 commit 的正确性。部分在 cd commit stage
执行的命令可以挪动到本地执行,比如 lint 检查、比如单元测试。当然,pre-commit
阶段执行的命令当然要保证其速度不要太慢,每次 commit 都等很久也不是什么好的体验
20.lint-staged
lint-staged 是一个在git暂存文件上运行linters的工具,当然如果你觉得每次修改一个文件就给所有文件执行一次lint检查不恶心的话,这个工具对你来说就没有什么意义了,请直接关闭即可。