关于javascript:FETOOLnpmv7-js包管理扫盲与进阶

8次阅读

共计 10897 个字符,预计需要花费 28 分钟才能阅读完成。

扫盲

npm init

一般模块用 npm init
作用域模块用 npm init --scope=@scope-name
npm init --yes or -y 会从当前目录提取的默认值

    name:当前目录名称
    version:总是 1.0.0
    description:自述文件中的信息,或者为空字符串 ""
    scripts:默认状况下会创立一个空 test 脚本
    keywords:空
    author:空
    license:ISC
    bugs:来自当前目录的信息(如果存在)homepage:来自当前目录的信息(如果存在)

为 init 命令设置配置选项

    npm set init.author.email "example-user@example.com"
    npm set init.author.name "example_user"
    npm set init.license "MIT"

npm install

npm install (with no args, in package dir)
npm install [<@scope>/]<name>
npm install [<@scope>/]<name>@<tag>
npm install [<@scope>/]<name>@<version>
npm install [<@scope>/]<name>@<version range>
npm install <git-host>:<git-user>/<repo-name>
npm install <git repo url>
npm install <tarball file>
npm install <tarball url>
npm install <folder>

alias: npm i
common options: [-P|--save-prod|-D|--save-dev|-O|--save-optional] [-E|--save-exact] [-B|--save-bundle] [--no-save] [--dry-run]

npm uninstall

npm uninstall [<@scope>/]<pkg>[@<version>]... [-S|--save|--no-save]

aliases: remove, rm, r, un, unlink

这将卸载软件包,从而齐全删除代表该软件包装置的所有 npm。也从 dependencies,devDependencies,optionalDependencies,peerDependencies 和 package.json 删除软件包。

此外,如果您应用 npm-shrinkwrap.json 或 package-lock.json,则 npm 也会更新这些文件。

–no-save 会通知 NPM 不会从你删除软件包 package.json,npm-shrinkwrap.json 或 package-lock.json 文件。

–save 或者 -S 会通知 NPM 从您删除软件包 package.json,npm-shrinkwrap.json 以及 package-lock.json 文件。这是默认设置,然而如果您 save=false 的 npmrc 文件中有实例,则可能须要应用它

在全局模式下(-g 或 –global),它将以后程序包上下文作为全局程序包卸载。–no-save 在这种状况下将被疏忽。

对于包格局

软件包是以下任意一种:

  • a)蕴含由 package.json 文件形容的程序的文件夹
  • b)gzipped 压缩蕴含(a)
  • c)解析为(b)的 URL
  • d)在注册表(比方官网的是 https://registry.npmjs.org)上公布的形如(c)的<name>@<version>
  • e)指向(d)的 <name>@<tag>(比方 vue@next)
  • f)具备“latest”标签的 <name> 满足(e)
  • g)解析为(a)的<git remote url>

npm 包 git URL 格局

能够通过以下形式格式化用于 npm 软件包的 Git URL:

    git://github.com/user/project.git#commit-ish
    git+ssh://user@hostname:project.git#commit-ish
    git+http://user@hostname/project/blah.git#commit-ish
    git+https://user@hostname/project/blah.git#commit-ish

其中 commit-ish 能够是任何的 tag, sha 或 branch 等可能 git checkout 的参数. 默认 commit-ish= master.

依赖

如果 npm 尝试装置的软件包之一是本机节点模块,并且须要编译 C ++ 代码,则 npm 将应用 node-gyp 来实现该工作。对于 Unix 零碎,node-gyp 须要 Python,make 和 GCC 之类的构建链。在 Windows 上,须要 Python 和 Microsoft Visual Studio C ++。node-gyp 不反对 Python 3

目录

npm 具备两种操作模式:

  • 本地模式:npm 将软件包装置到以后我的项目目录中,该目录默认为当前工作目录。软件包装置到 ./node_modules,并装箱到./node_modules/.bin
  • 全局模式:npm 将软件包装置到的装置前缀中,$npm_config_prefix/lib/node_modules 并将容器装 到 $npm_config_prefix/bin。

本地模式是默认模式。在任何命令上应用 -g 或 –global 在全局模式下运行。

公布

  • 一般模块用 npm publish
  • 作用域模块用 npm publish --access public
  • 公布 tag: npm publish --tag <tag>
  • 将 dist 标签增加到您的软件包的特定版本中npm dist-tag add <package-name>@<version> [<tag>]
  • 只跟新 README.mdnpm version patch && npm publish
  • .npmignore .gitignore 等用来避免公布无关信息

依赖项

  • “dependencies”:在生产中所需的软件包。npm install <package-name> [--save-prod]
  • “devDependencies”:仅本地开发和测试所需的软件包。npm install <package-name> --save-dev

语义版本控制

三段数字从左导到右: 主版本. 副版本. 补丁。参考 semver
指定依赖的版本(参考):

  • 起第一个非零位固定,其余位可增,应用^
  • 范畴示意:应用 >,<,=,>= 或 <= 用于比拟,或 - 以指定一个蕴含范畴
  • 多个版本应用||
  • 大于等于该版本,小于主版本 应用~

应用 node-semver 判断是否非法

弃用包

  • 弃用包npm deprecate <package-name> "<message>"
  • 弃用指定版本的包npm deprecate <package-name>@<version> "<message>"
  • 撤销弃用npm deprecate <package-name>@<version> ""

勾销公布

作为软件包所有者或合作者,如果您的软件包没有依赖项,则能够应用 CLI 从 npm 注册表中永恒删除它。你能够勾销公布 72 小时内最后的公布。超过 72 小时后,如果合乎特定条件,您依然能够勾销公布软件包。

  • 勾销公布程序包 npm unpublish <package-name> -f 会从注册表中永恒删除该程序包,因而其余用户将无奈再应用该程序包进行装置。
  • 勾销公布软件包的单个版本npm unpublish <package-name>@<version>

更新包

  • 确定哪些全局软件包须要更新 npm outdated -g --depth=0
  • 更新单个全局包 npm update -g <package_name>
  • 更新所有全局装置的软件包 npm update -g

删除包

  • 从 node_modules 目录中删除本地软件包npm uninstall <package_name>
  • 从 package.json 依赖项中删除本地程序包npm uninstall --save <package_name>
  • 卸载全局软件包npm uninstall -g <package_name>

平安

  • 通过运行平安审核 npm audit
  • npm audit 要求软件包具备 package.json 和 package-lock.json 文件。(解决 EAUDITNOPJSON 和 EAUDITNOLOCK 谬误)
  • 如果找到安全漏洞并且有可用的更新 npm audit fix
  • 敞开 npm audit

    • 单个包 npm install example-package-name --no-audit
    • 全局 npm set audit false

进阶

v7 新增性能与变动

  • git diff 相似比拟 2 个包差别 npm diff
  • 从本地或近程 npm 程序包运行命令npm exec
  • 打印依赖链npm explain <folder | specifier> (当试图弄清楚为什么要复制给定的依赖项以满足我的项目中互相抵触的版本要求时,这可能会很有用。)
  • npm 的装置算法的局限性 在 npm7 中解决了。本来不容许装置和本身重名的包,避免递归有限 install。
  • 反对 workplace

包的初始化

源码用的 init-package-json

默认状况下,npm 已事后配置为应用 npm 的公共注册表,网址为 https://registry.npmjs.org
如果软件包应用 git URL 列出了依赖关系,则 npm 将应用 git 命令装置该依赖关系,如果未装置,则会生成谬误。

npm init [--force|-f|--yes|-y|--scope]
npm init <@scope> (same as `npx <@scope>/create`)
npm init [<@scope>/]<pkg> (same as `npx [<@scope>/]create-<pkg>`)

npm init <initializer>可用于设置新的或现有的 npm 包。

在这种状况下,initializer 程序是一个名为 create-<initializer> 的 npm 程序包,它将由 npxnpx 装置,而后执行其主程序仓库 – 可能会创立或更新 package.json 并运行任何其余与初始化相干的操作。

init 命令被转换为相应的 npx 操作,如下所示:

npm init foo - > npx create-foo
npm init @usr/foo - > npx @usr/create-foo
npm init @usr - > npm init @usr npx @usr/create

任何其余选项都将间接传递给命令,因而 npm init foo --hello 将映射到npx create-foo --hello

如果初始化程序被省略(通过调用 npm init),init 将回退到传统的 init 行为。它会问你一堆问题,而后为你写一个 package.json。它会尝试依据抉择的现有字段,依赖关系和选项进行正当的猜想。它是严格相加的,所以它会保留曾经设置的任何字段和值。您也能够应用 -y / --yes 来齐全跳过考察问卷。如果你传递--scope,它将创立一个范畴包。

简略但实用的一些命令

  • 用编辑器关上包 npm edit react --editor code(在 vscode 关上 node_modules/react)
  • 尝试浏览器关上包的 bug URLnpm bugs
  • 尝试浏览器关上包的阐明文档 URLnpm docs
  • 尝试浏览器关上包的存储库 URLnpm repo
  • 打印 npm 将在其中装置可执行文件的文件夹。npm bin
  • 增加用户帐户 npm adduser npm login
  • 登记 npm logout
  • 在所有 npm 命令中启用制表符补全 npm completion
  • 简化依赖树 npm ddp
  • 能够临时定位到包的目录 npm explore some-dependency -- git pull origin master 对于 node_modules 文件夹中的 git submodule,特地不便
  • npm doctor运行一组查看,以确保您的 npm 装置具备治理 JavaScript 软件包所需的内容。包含:

    • npm ping
    • npm -v
    • node -v
    • npm config get registry
    • which git
    • 权限查看
    • 验证缓存包的校验和
  • npm ls将以 –all 树状构造将已装置的所有版本的软件包及其指定的依赖项打印到规范输入。
  • npm ping ping npm 注册表 –npm prefix [-g] 打印蕴含 package.json 文件或 node_modules 目录的最靠近的父目录
  • npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json] 删除无关的软件包
  • npm pack [[<@scope>/]<pkg>...] [--dry-run] 将其提取到缓存中,将 tarball 复制到当前目录工作目录为<name>-<version>.tgz,而后将文件名写出到 stdout。
  • npm rebuild [[<@scope>/]<name>[@<version>] ...] node 版本切换后,必须从新编译 c++ 的库
  • npm restart 等同于npm run-script restart
  • npm test 等同于npm run-script test
  • npm root 打印 node_modules 文件夹
  • npm set-script [<script>] [<command>] 在 package.json 中创立工作
  • npm shrinkwrap 生成 shrinkwrap 的 package lock 文件,作用优于 package-lock.json
  • npm stars [<user>] 珍藏用户
  • npm star [<pkg>...] 珍藏库
  • npm unstar [<pkg>...] 勾销珍藏库
  • npm stop [-- <args>]如果未定义 stop, 则不会运行默认脚本
  • npm view [<@scope>/]<name>[@<version>] ...] 查看注册表信息

    • npm view connect间接接包名查看包信息
    • npm view ronn@0.3.5 dependencies查看包依赖
    • npm view connect versions查看包历史版本列表,如果 version 不加 s 则示意查看包最新版本。
  • npm whoami 打印 username 配置

npm cache 包缓存

npm cache add <tarball file>
npm cache add <folder>
npm cache add <tarball url>
npm cache add <name>@<version>

npm cache clean
aliases: npm cache clear, npm cache rm

npm cache verify
  • add:将指定的软件包增加到本地缓存中。该命令次要供 npm 在外部应用,然而它能够提供一种将数据显式增加到本地装置缓存的办法。
  • clean:从缓存文件夹中删除所有数据。请留神,这通常是不必要的,因为 npm 的缓存具备自我修复性能并且能够抵制数据损坏问题。
  • verify:验证缓存文件夹的内容,对所有不须要的数据进行垃圾回收,并验证缓存索引和所有缓存数据的完整性

npm ci 自动化环境装置

此命令与类似 npm install,不同之处在于它用于自动化环境(例如测试平台,继续集成和部署),或者在任何状况下都要确保洁净装置依赖项。

npm ci 在以下状况下将显着进步速度:

  • 有一个 package-lock.jsonnpm-shrinkwrap.json文件。
  • 该 node_modules 文件夹失落或为空。

简而言之,应用 npm install 和 npm ci 之间的次要区别是:

  • 该我的项目必须具备现有的 package-lock.json 或 npm-shrinkwrap.json。
  • 如果程序包锁中的依赖项与中的不匹配 package.json,npm ci 则将退出并显示谬误,而不是更新程序包锁。
  • npm ci 一次只能装置整个我的项目:不能应用此命令增加单个依赖项。
  • 如果 node_modules 曾经存在,它将在 npm ci 开始装置之前被主动删除。
  • 它永远不会写入 package.json 或执行任何程序包锁定:装置实际上是解冻的。

npm 钩子

npm hook ls [pkg]
npm hook add <entity> <url> <secret>
npm hook update <id> <url> [secret]
npm hook rm <id>

钩子容许您配置 URL 端点,只有任何受反对的实体类型产生更改,就会告诉这些端点。

npm install 相干

  • 应用 –production 标记(或者当 NODE_ENV 环境变量设置为 production),npm install将不会装置 devDependencies 列出的模块。
  • npm install-ci-test 此命令运行 npm ci 而后立刻执行 npm test (别名: npm cit)。
  • npm install-test这个命令运行一个 npm install 而后立刻执行 npm test。它采纳与 npm install 完全相同的参数。

npm link

首先,包文件夹中的 npm link 将在全局文件夹 {prefix}/lib/node_modules/<package> 中创立一个链接到执行 npm link 命令的包。(请参阅 npm-config 理解 prefix 的值)。它还会将软件包中的任何 bin 链接到{prefix}/bin/{name}。

接下来,在其余某个地位,npm link package-name 将创立一个从全局装置的 package-name 到以后文件夹的 node_modules/ 的符号链接。

也就是说,它首先创立一个全局链接,而后将全局装置指标链接到我的项目的 node_modules 文件夹中。

npm token

npm token list [--json|--parseable]
  npm token create [--read-only] [--cidr=1.1.1.1/24,2.2.2.2/16]
  npm token revoke <id|token>
  • list 显示所有流动身份验证令牌的表
  • create 创立一个新的身份验证令牌。
  • revoke 立刻从注册表中删除身份验证令牌

npm script

前置和后置脚本

{
  "scripts": {"precompress": "{{ executes BEFORE the `compress` script}}",
    "compress": "{{run command to compress files}}",
    "postcompress": "{{executes AFTER `compress` script}}"
  }
}

工作区(v7 新增)

这组性能补救了本地文件系统中解决链接包的工作流的简化,防止手动应用链接 npm link

// package.json
{
  "name": "my-workspaces-powered-project",
  "workspaces": ["workspace-a"]
}

install 后目录构造

.
+-- node_modules
|  `-- workspace-a -> ../workspace-a
+-- package-lock.json
+-- package.json
`-- workspace-a
   `-- package.json

应用

// ./workspace-a/index.js
module.exports = "a";

// ./lib/index.js
const moduleA = require("workspace-a");
console.log(moduleA); // -> a

生命周期脚本

有一些非凡的生命周期脚本仅在某些状况下产生。除了“pre”和“post”脚本之外,还会产生这些脚本。
prepare,prepublish(已弃用),prepublishOnly,prepack,postpack

生命周期操作程序

npm publish
    prepublishOnly
    prepare
    prepublish
    publish
    postpublish
npm pack
    prepack
    postpack
npm install
    preinstall
    install
    postinstall
Also triggers
    prepublish (when on local)
    prepare (when on local or workspaces)
npm start
    prestart
    start
    poststart

默认值

  • "start": "node server.js"
  • "install": "node-gyp rebuild"

如果要在所有包的特定生命周期事件中运行特定脚本,则能够应用挂钩脚本。将可执行文件放在 node_modules/.hooks/{eventname}

包装置门路

todo

npm 配置

npm config set <key>=<value> [<key>=<value> ...]
npm config get [<key> [<key> ...]]
npm config delete <key> [<key> ...]
npm config list [--json]
npm config edit
npm set <key>=<value> [<key>=<value> ...]
npm get [<key> [<key> ...]]
alias: c

npm 从命令行,环境变量,npmrc 文件以及某些状况下(从 package.json 文件中)获取其配置设置。

反对的 npmrc 门路:

  • 每个我的项目的配置文件(/path/to/my/project/.npmrc)
  • 每个用户的配置文件(~/.npmrc)
  • 全局配置文件($PREFIX/etc/npmrc)
  • npm 内置配置文件(/path/to/npm/npmrc)

npm 配置项

反对环境变量:任何以 npmconfig结尾的环境变量 npmconfig将被解释为配置参数。例如,将 npm_config_foo=bar 放入您的环境中将会将 foo 配置参数设置为 bar。任何未赋予值的环境配置都将被赋予 true 值。配置值不辨别大小写,所以 NPM_CONFIG_FOO=bar 会起同样的作用。

npm v7 config 文档
npm v6 config 中文 非官方

package.json 配置项

  • name

    • 该名称必须小于或等于 214 个字符。这包含范畴包的范畴。
    • 名称不能以点或下划线结尾。
    • 新包名称中不能蕴含大写字母。
    • 该名称最终成为 URL 的一部分,命令行中的参数以及文件夹名称。因而,该名称不能蕴含任何非 URL 平安字符。
  • version 版本号
  • description

    • 字符串。这有助于人们发现你的包,因为它在 npm search 列出
  • homepage 主页 URL
  • bugs 字符串或对象

    {
      "url": "https://github.com/owner/project/issues",
      "email": "project@hostname.com"
    }
  • license

    • 如果您的软件包应用多个通用许可证进行许可,请应用 SPDX 许可证表达式语法版本 2.0 字符串
  • author 或 contributors

    • 对象

      {
        "name": "Barney Rubble",
        "email": "b@rubble.com",
        "url": "http://barnyrubble.tumblr.com/"
      }
    • 文本

      {"author": "Barney Rubble <b@rubble.com> (http://barnyrubble.tumblr.com/)"
      }
  • files

    • 它形容了将软件包作为依赖项装置时要蕴含的条目, 遵循与.gitignore 类似的语法
    • 还能够在包的根目录或子目录中提供一个.npmignore 文件,这将避免蕴含文件
    • 如果有.gitignore 文件,并且短少.npmignore,则会应用.gitignore 的内容
    • 无论设置如何,都会蕴含某些文件:

      • package.json
      • README
      • CHANGES / CHANGELOG / HISTORY

      -LICENSE / LICENCE

      • NOTICE
      • 在“main”字段中的文件
    • 相同,一些文件总是被疏忽:

      • .git
      • CVS
      • .svn
      • .hg
      • .lock-wscript
      • .wafpickle-N
      • .*.swp
      • .DS_Store
      • ._*
      • npm-debug.log
      • .npmrc
      • node_modules
      • config.gypi
      • *.orig
      • package-lock.json (如果想公布用 npm-shrinkwrap.json)
  • main 主入口
  • bin

    • 在装置时,npm 会将文件符号链接到 prefix/bin 以进行全局装置或./node_modules/.bin/ 本地装置。
    • 单执行文件“bin”:“./path/to/program”
    • 多入口

          "bin": {"my-program": "./path/to/program"}
    • 请确保您援用的文件以 #!/usr/bin/env node 结尾, 否则不会用 node 执行
  • man

    • 指定要搁置的单个文件或文件名数组,以供 man 程序查找
  • directories CommonJS

    • bin
    • man
  • repository 指定您的代码所在的中央。

    {
        "repository": {
            "type": "git",
            "url": "https://github.com/npm/cli.git"
        }
    }
  • scripts`
  • config 对象 用于设置软件包脚本中应用的配置参数,这些配置脚本会在降级期间继续存在。
  • dependencies
  • devDependencies 下载并构建您应用的内部测试或文档框架用到的库。
  • peerDependencies 表白软件包与主机工具或库的兼容性
  • peerDependenciesMeta 用户装置您的软件包时,如果 peerDependencies 尚未装置中指定的软件包,npm 将收回正告。该 peerDependenciesMeta 字段用于向 npm 提供无关如何应用对等依赖项的更多信息。

    "peerDependenciesMeta": {
        "soy-milk": {"optional": true}
    }
  • bundledDependencies 这些软件包名称将在公布软件包时捆绑在一起。
  • optionalDependencies 如果找不到依赖项或装置失败,则心愿 npm 持续,则能够将其放在 optionalDependencies 对象中。
  • engines 指定版本

    {
    "engines": {
        "node": ">=0.10.3 <15",
        "npm": "~1.0.20"
    }
    }
  • engineStrict 破除
  • os 指定操作系统

    {
        "os": [
            "darwin",
            "linux",
            "!win32"
        ]
    }
  • cpu 指定 cpu

    {
        "cpu": [
            "x64",
            "ia32",
            "!arm",
            "!mips"
        ]
    }
  • private 设置 "private": true 避免意外公布公有存储库
  • publishConfig 这是将在公布时应用的一组配置值。如果要设置 tag,registry 或 access,这特地不便,这样能够确保给定的程序包不标记为“latest”,不公布到全局公共注册表,或者默认状况下作用域模块是公有的。
  • workspaces 见上
正文完
 0