1.package.json 是什么?
什么是Node.js的模块(Module)?在Node.js中,模块是一个库或框架,也是一个Node.js项目。Node.js项目遵循模块化的架构,当我们创建了一个Node.js项目,意味着创建了一个模块,这个模块的描述文件,被称为package.json。
先上一个代码:
{"name": "vue-cli2.x","version": "1.0.0","description": "A Vue.js project","author": "hct","private": true,"scripts": {"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js","start": "npm run dev","unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run","e2e": "node test/e2e/runner.js","test": "npm run unit && npm run e2e","lint": "eslint --ext .js,.vue src test/unit test/e2e/specs","build": "node build/build.js"},"dependencies": {"vue": "^2.5.2","vue-router": "^3.0.1"},"devDependencies": {"autoprefixer": "^7.1.2","babel-core": "^6.22.1","babel-eslint": "^8.2.1","babel-helper-vue-jsx-merge-props": "^2.0.3","babel-loader": "^7.1.1","babel-plugin-istanbul": "^4.1.1","babel-plugin-syntax-jsx": "^6.18.0","babel-plugin-transform-runtime": "^6.22.0","babel-plugin-transform-vue-jsx": "^3.5.0","babel-preset-env": "^1.3.2","babel-preset-stage-2": "^6.22.0","babel-register": "^6.22.0","chai": "^4.1.2","chalk": "^2.0.1","chromedriver": "^2.27.2","copy-webpack-plugin": "^4.0.1","cross-env": "^5.0.1","cross-spawn": "^5.0.1","css-loader": "^0.28.0","eslint": "^4.15.0","eslint-config-standard": "^10.2.1","eslint-friendly-formatter": "^3.0.0","eslint-loader": "^1.7.1","eslint-plugin-import": "^2.7.0","eslint-plugin-node": "^5.2.0","eslint-plugin-promise": "^3.4.0","eslint-plugin-standard": "^3.0.1","eslint-plugin-vue": "^4.0.0","extract-text-webpack-plugin": "^3.0.0","file-loader": "^1.1.4","friendly-errors-webpack-plugin": "^1.6.1","html-webpack-plugin": "^2.30.1","inject-loader": "^3.0.0","karma": "^1.4.1","karma-coverage": "^1.1.1","karma-mocha": "^1.3.0","karma-phantomjs-launcher": "^1.0.2","karma-phantomjs-shim": "^1.4.0","karma-sinon-chai": "^1.3.1","karma-sourcemap-loader": "^0.3.7","karma-spec-reporter": "0.0.31","karma-webpack": "^2.0.2","mocha": "^3.2.0","nightwatch": "^0.9.12","node-notifier": "^5.1.2","optimize-css-assets-webpack-plugin": "^3.2.0","ora": "^1.2.0","phantomjs-prebuilt": "^2.1.14","portfinder": "^1.0.13","postcss-import": "^11.0.0","postcss-loader": "^2.0.8","postcss-url": "^7.2.1","rimraf": "^2.6.0","selenium-server": "^3.0.1","semver": "^5.3.0","shelljs": "^0.7.6","sinon": "^4.0.0","sinon-chai": "^2.8.0","uglifyjs-webpack-plugin": "^1.1.1","url-loader": "^0.5.8","vue-loader": "^13.3.0","vue-style-loader": "^3.0.1","vue-template-compiler": "^2.5.2","webpack": "^3.6.0","webpack-bundle-analyzer": "^2.9.0","webpack-dev-server": "^2.9.1","webpack-merge": "^4.1.0"},"engines": {"node": ">= 6.0.0","npm": ">= 3.0.0"},"browserslist": ["> 1%","last 2 versions","not ie <= 8"]}
2.属性说明
name
name和version字段是package.json文件中最重要的字段。这是必须的字段,如果你的npm包没有指定这两个字段,将无法被安装。name和version字段被假定组合成一个唯一的标识符。包内容的更改和包版本的更改是同步的。
name字段的含义就是npm包名。
几个规则:
- name的长度必须小于等于214个字符。
- name不能以”.”(点)或者”_”(下划线)开头。
- name中不能包含大写字母。
- name最终将被用作URL的一部分、命令行的参数和文件夹名。因此,name不能含有非URL安全的字符。
几个建议:
- 不要使用已存在的name作为包名。
- 不要在name中使用”js”和”node”,这会假定这是js文件,一旦你写一个package.json文件,你就可以在”engines”字段中指定解释器引擎。
- name字段可能会被作为传输传递给require()函数,因此它最好是简短的、自描述的。
- 你可能会需要在深入开发一个包之前先检查npm的registry来确认某个name是否被使用过,可以参考https://www.npmjs.com/。
一个name可以用scope来指定一个前缀,比如@myorg/mypackage,可以参考npm-scope。
version
包的版本号,name和version字段被假定组合成一个唯一的标识符。包内容的更改和包版本的更改是同步的。
version字段必须能够被node-semver解析,node-semver作为依赖项被捆绑进了npm中。(可以使用npm install semver来使用)
关于版本号和范围的信息可以参考semver。
description
npm包的描述,description是一个字符串。它可以帮助人们在使用npm search时找到这个包
keywords
npm包的关键字,keywords是一个字符串的数组。它可以帮助人们在使用npm search时找到这个包。
homepage
项目主页的url。
注意: 这和”url”不一样。如果你放一个”url”字段,registry会以为是一个跳转到你发布在其他地方的地址,然后鄙视你。
bugs
改项目的issue跟踪页面或这报告issue的email地址。这对使用这个包遇到问题的用户会有帮助。
像这样:
{"url" : "https://github.com/owner/project/issues","email" : "project@hostname.com"}
你可以择其一或者两个都写上。如果只想提供一个url,你可以对”bugs”字段指定一个字符串而不是object。
如果提供了一个url,它会被用于npm bugs命令。
license
你应该对你的包指定一个license来让用户知道他们的使用权利和和任何限制。
如果你正在使用BSD-2-Clause或MIT这样的通用许可证,可以为你的license添加一个当前SPDX的许可证标识符,比如:
