npm

https://docs.npmjs.com/about-npm

  • 集中管理所有模块,所有模块都上传仓库(registry)
  • package.json 管理模块信息,node_modules 保存依赖
  • 2020 npm 被 github 收购

image.png

常用操作

  • npm init 初始化
  • npm install 安装
  • npm publish 发布
  • npm run 运行

npm link

在要用的包里,执行, 就可以调试自己开发的包了

npm link xxx(上面的包名字)

解除链接

npm unlink

  1. **利用 npm link,高效率在本地调试以验证包的可用性**
  2. <a name="jn7H1"></a>
  3. ## npm init
  4. [https://docs.npmjs.com/cli/v6/commands/npm-init](https://docs.npmjs.com/cli/v6/commands/npm-init)<br />init 命令转化为对应的npx操作如下:
  5. - npm init foo -> npx create-foo
  6. - npm init @usr/foo -> npx @usr/create-foo
  7. - npm init @usr -> npx @usr/create
  8. <a name="iauSn"></a>
  9. ## npx
  10. <a name="XT1FS"></a>
  11. # packge.json
  12. [https://docs.npmjs.com/cli/v8/configuring-npm/package-json](https://docs.npmjs.com/cli/v8/configuring-npm/package-json)<br />[http://nodejs.cn/learn/the-package-json-guide](http://nodejs.cn/learn/the-package-json-guide)
  13. - version 表明了当前的版本。
  14. - name 设置了应用程序/软件包的名称。
  15. - description 是应用程序/软件包的简短描述。
  16. - private 如果设置为 true,则可以防止应用程序/软件包被意外地发布到 npm
  17. <a name="Jz74i"></a>
  18. ## bin
  19. [https://docs.npmjs.com/cli/v8/configuring-npm/package-json#bin](https://docs.npmjs.com/cli/v8/configuring-npm/package-json#bin)<br />在bin字段下映射命令和对应的执行脚本
  20. ```json
  21. {
  22. "name": "my-program",
  23. "version": "1.2.5",
  24. "bin": {
  25. "my-program": "program.js"
  26. }
  27. }

全局安装 my-program 命令会注册到全局,非全局的话会自动连接到项目的node_module/.bin下的可执行文件
脚本文件的首行要加上下面这句话,系统会自动通过 node 去执行

  1. #!/usr/bin/env node

scripts

“scripts”要为部分中定义的任何脚本创建“pre”或“post”脚本 package.json

  1. {
  2. "scripts": {
  3. "precompress": "{{ executes BEFORE the `compress` script }}",
  4. "compress": "{{ run command to compress files }}",
  5. "postcompress": "{{ executes AFTER `compress` script }}"
  6. }
  7. }

type

  • type:默认为commonjs ,可以指定为为module,则变为ESM模块规范

入口

  • main : 定义了 npm 包的入口文件,browser 环境和 node 环境均可使用
  • module : 定义 npm 包的 ESM 规范的入口文件,browser 环境和 node 环境均可使用
  • browser : 定义 npm 包在 browser 环境下的入口文件


优先级browser = browser+mjs > module > browser+cjs > main

  • 如果 npm 包导出的是 ESM 规范的包,使用 module
  • 如果 npm 包只在 web 端使用,并且严禁在 server 端使用,使用 browser。
  • 如果 npm 包只在 server 端使用,使用 main
  • 如果 npm 包在 web 端和 server 端都允许使用,使用 browser 和 main

exports

  1. {
  2. "name":"pkg",
  3. "main": "./main-require.cjs",
  4. "exports": {
  5. "import": "./main-module.js",
  6. "require": "./main-require.cjs"
  7. },
  8. "type": "module"
  9. }

如果存在exports属性,exports属性不仅优先级高于main,同时也高于module和browser字段。

files

file字段是一个包含在你项目里的文件的数组,里面的内容是文件名或者文件夹名。如果是文件夹,那么里面的文件也会被包含进来
也可以使用.npmignore忽略

参考资料