1.package.json 是什么?

什么是Node.js的模块(Module)?在Node.js中,模块是一个库或框架,也是一个Node.js项目。Node.js项目遵循模块化的架构,当我们创建了一个Node.js项目,意味着创建了一个模块,这个模块的描述文件,被称为package.json。

先上一个代码:

  1. {
  2. "name": "vue-cli2.x",
  3. "version": "1.0.0",
  4. "description": "A Vue.js project",
  5. "author": "hct",
  6. "private": true,
  7. "scripts": {
  8. "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
  9. "start": "npm run dev",
  10. "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
  11. "e2e": "node test/e2e/runner.js",
  12. "test": "npm run unit && npm run e2e",
  13. "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
  14. "build": "node build/build.js"
  15. },
  16. "dependencies": {
  17. "vue": "^2.5.2",
  18. "vue-router": "^3.0.1"
  19. },
  20. "devDependencies": {
  21. "autoprefixer": "^7.1.2",
  22. "babel-core": "^6.22.1",
  23. "babel-eslint": "^8.2.1",
  24. "babel-helper-vue-jsx-merge-props": "^2.0.3",
  25. "babel-loader": "^7.1.1",
  26. "babel-plugin-istanbul": "^4.1.1",
  27. "babel-plugin-syntax-jsx": "^6.18.0",
  28. "babel-plugin-transform-runtime": "^6.22.0",
  29. "babel-plugin-transform-vue-jsx": "^3.5.0",
  30. "babel-preset-env": "^1.3.2",
  31. "babel-preset-stage-2": "^6.22.0",
  32. "babel-register": "^6.22.0",
  33. "chai": "^4.1.2",
  34. "chalk": "^2.0.1",
  35. "chromedriver": "^2.27.2",
  36. "copy-webpack-plugin": "^4.0.1",
  37. "cross-env": "^5.0.1",
  38. "cross-spawn": "^5.0.1",
  39. "css-loader": "^0.28.0",
  40. "eslint": "^4.15.0",
  41. "eslint-config-standard": "^10.2.1",
  42. "eslint-friendly-formatter": "^3.0.0",
  43. "eslint-loader": "^1.7.1",
  44. "eslint-plugin-import": "^2.7.0",
  45. "eslint-plugin-node": "^5.2.0",
  46. "eslint-plugin-promise": "^3.4.0",
  47. "eslint-plugin-standard": "^3.0.1",
  48. "eslint-plugin-vue": "^4.0.0",
  49. "extract-text-webpack-plugin": "^3.0.0",
  50. "file-loader": "^1.1.4",
  51. "friendly-errors-webpack-plugin": "^1.6.1",
  52. "html-webpack-plugin": "^2.30.1",
  53. "inject-loader": "^3.0.0",
  54. "karma": "^1.4.1",
  55. "karma-coverage": "^1.1.1",
  56. "karma-mocha": "^1.3.0",
  57. "karma-phantomjs-launcher": "^1.0.2",
  58. "karma-phantomjs-shim": "^1.4.0",
  59. "karma-sinon-chai": "^1.3.1",
  60. "karma-sourcemap-loader": "^0.3.7",
  61. "karma-spec-reporter": "0.0.31",
  62. "karma-webpack": "^2.0.2",
  63. "mocha": "^3.2.0",
  64. "nightwatch": "^0.9.12",
  65. "node-notifier": "^5.1.2",
  66. "optimize-css-assets-webpack-plugin": "^3.2.0",
  67. "ora": "^1.2.0",
  68. "phantomjs-prebuilt": "^2.1.14",
  69. "portfinder": "^1.0.13",
  70. "postcss-import": "^11.0.0",
  71. "postcss-loader": "^2.0.8",
  72. "postcss-url": "^7.2.1",
  73. "rimraf": "^2.6.0",
  74. "selenium-server": "^3.0.1",
  75. "semver": "^5.3.0",
  76. "shelljs": "^0.7.6",
  77. "sinon": "^4.0.0",
  78. "sinon-chai": "^2.8.0",
  79. "uglifyjs-webpack-plugin": "^1.1.1",
  80. "url-loader": "^0.5.8",
  81. "vue-loader": "^13.3.0",
  82. "vue-style-loader": "^3.0.1",
  83. "vue-template-compiler": "^2.5.2",
  84. "webpack": "^3.6.0",
  85. "webpack-bundle-analyzer": "^2.9.0",
  86. "webpack-dev-server": "^2.9.1",
  87. "webpack-merge": "^4.1.0"
  88. },
  89. "engines": {
  90. "node": ">= 6.0.0",
  91. "npm": ">= 3.0.0"
  92. },
  93. "browserslist": [
  94. "> 1%",
  95. "last 2 versions",
  96. "not ie <= 8"
  97. ]
  98. }

接下来我们慢慢解析其中的代码所代表的意思:

2.属性说明

name

name和version字段是package.json文件中最重要的字段。这是必须的字段,如果你的npm包没有指定这两个字段,将无法被安装。name和version字段被假定组合成一个唯一的标识符。包内容的更改和包版本的更改是同步的。

name字段的含义就是npm包名。

几个规则:

  1. name的长度必须小于等于214个字符。
  2. name不能以”.”(点)或者”_”(下划线)开头。
  3. name中不能包含大写字母。
  4. name最终将被用作URL的一部分、命令行的参数和文件夹名。因此,name不能含有非URL安全的字符。

几个建议:

  1. 不要使用已存在的name作为包名。
  2. 不要在name中使用”js”和”node”,这会假定这是js文件,一旦你写一个package.json文件,你就可以在”engines”字段中指定解释器引擎。
  3. name字段可能会被作为传输传递给require()函数,因此它最好是简短的、自描述的。
  4. 你可能会需要在深入开发一个包之前先检查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地址。这对使用这个包遇到问题的用户会有帮助。
像这样:

  1. {
  2.   "url" : "https://github.com/owner/project/issues",
  3.   "email" : "project@hostname.com"
  4. }

你可以择其一或者两个都写上。如果只想提供一个url,你可以对”bugs”字段指定一个字符串而不是object。
如果提供了一个url,它会被用于npm bugs命令。

license

你应该对你的包指定一个license来让用户知道他们的使用权利和和任何限制。
如果你正在使用BSD-2-Clause或MIT这样的通用许可证,可以为你的license添加一个当前SPDX的许可证标识符,比如: