-
Notifications
You must be signed in to change notification settings - Fork 25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
NPM 相关知识 #42
Comments
npm 基本用法每天都在使用 npm,但自己明白很多地方还是不清楚,为此决定仔细阅读 npm 的官方文档,这篇文章讲解了 npm 的基本使用方法,后续会讲 npm 的一些高级用法。 虽然前不久出现的 yarn 确实比 npm 快,但是我想 npm 至少还会使用很久,因此有必要详细了解它。
|
常用的 npm 命令npm 有很多命令,有很多并不常用,而有些则非常常用,还有些很有用,但很多人却不知道,下面列出了一些常见和一些非常有用的命令,并详细说明了它的用法。 ls (alias list, la, ll)使用该命令可以列出当前项目依赖的模块,比较常见的参数有 只列出最上层的依赖
npm ls --depth=0 使用 link这是一个相当有用的命名,对于开发这很重要。设想一下场景: 你在开发一个模块 A,同时需要在另外一个项目 B 中测试它,你当然可以将该模块的代码移动到需要使用它的项目中,但这也不是理想的方法。 此时可以使用 link 来解决。npm link 的使用分为两步。 第一步 在模块 A 的项目根目录下执行 第二步 在项目 B 的根目录下执行 install (alias i)这个命令想必都很熟悉了,用来安装模块。只是安装模块的来源有很多种,有来自 git 地址的,有来自 npm 的,有来自 github 仓库的,如何来安装这些来自不同途径的模块呢? npm install 不带任何参数,这会安装 npm install 从 npm 源上安装一个模块 npm install @<version|tag> 从 npm 源上安装指定版本或者 tag 的模块 npm install 从一个 git 地址上安装模块,比如:
npm install /[#] 从 github 上的每个开发这的仓库里安装,比如安装最新的 express: 默认会安装 master 分支
npm i expressjs/express
安装 5.0 分支
npm i expressjs/express#5.0 npm install file: 从本地文件系统安装,比如: npm i file:../moduleA 安装上层目录的 moduleA 安装来源真非常多,更多方式请参考 npm install。 uninstall移除一个模块,这会移除某个模块自身和其依赖,为了将其从 shrinkwrapnpm 推荐开发者使用 semver 来设置模块的版本号,而且 npm 默认使用 模块的不确定性导致开发阶段表现良好的代码,在部署以后出现了问题。为此需要做的是限定在下次安装的时候也只使用特定的版本。有的团队采用将 npm shrinkwrap 可以记录下当前项目使用的所有的模块的版本,并将他们记录在一个 如何使用 npm shrinkwrap
当你增加或者移除了依赖,这个时候需要重新生成一下 使用了 shrinkwrap 之后,用户在安装你的模块的时候也会安装符合你的模块要求的依赖,这样可以有效地避免因为依赖升级导致自己的项目挂掉。当然了,及时这样也不能保证,完全不会出问题,如果一个模块的维护者,强制更新了代码但是没有更改版本号,这还是可能会出现问题,所以在使用第三方模块的时候要小心选择。 run我想这个命令的使用频率仅次于 install 了。在 npm 的基本用法 一文中提到了 npm script, 比如在 package.json 中有这样的内容: {
"scripts":{
"build": "webpack"
}
} 为了运行 build 命令,需要执行
如果需要在命令行中给 webpack 传入一些参数,比如想要执行 运行 关于 npm script 的内容后面还会细说。 adduser (alias login)在发布模块的时候常常要先进行登录,这个时候就需要用到该命令,键入
whoami就像 Linux 系统里面的 whoami 一样, npm whoami --registry https://registry.npm.taobao.org outdated使用
第一列是可以升级的模块,第二列是当前版本号,第三列是在 package.json 中指定的版本号,第四列是指该模块最新的版本,最后一列是当前项目名称。 npm 有很多有用的命令,知道了这些常用的命令的使用方法,以及适用场景能够极大地加快效率,毕竟是每天都要使用的工具,有必要了解它、熟悉它。下一篇文章,准备谈谈 npm script 的相关知识。 |
npm script 用法详解什么是 npm scriptnpm script 是记录在 必须开发者常常需要使用以下命令来统计项目中的代码行数: find src -name "*.js" | xargs cat | wc -l 开发者可以将其写入 "scripts":{
"lines": "find src -name \"*.js\" | xargs cat | wc -l",
} 以后开发者只需要执行 环境变量
|
npm 是如何影响 node_modules 的目录结构的 ?一个大型项目常常要依赖很多第三方的模块,而第三方的模块又有自己的依赖,假如其中有两个模块依赖了同一个模块的不同版本,这个时候该模块就要存在两个不同版本,那么它们在 node_modules 中是如何存在的呢? npm 的大量工作都是在处理这样的版本依赖问题。 比如你的项目 yxxx,有如下依赖: "dependencies": {
A: "1.0.0",
C: "1.0.0"
} 而 A 和 C 两个模块有如下的依赖关系。 npm v2 时代在 npm v2 时代,执行
这个时候如果在安装一个模块,[email protected],D 有如下依赖: 安装完成之后,node_modules 会是这样的:
[email protected] 存在了两份,这显然是浪费的,这也是被吐槽最多的点,一个项目中存在太多相同版本的模块的副本。 想想 require 在寻找模块时候的机制,它会向上级目录去寻找,因此 npm 3 做了改变。 npm v3 时代安装 [email protected] 模块,现在的目录结构变为:
可以看到他们存在于同一级目录,这个时候 A 中的 js 脚本在 A 中找不到 node_modules 后会在父级目录中找到 B 模块。 继续安装 [email protected] 模块,因为 [email protected] 依赖的是 [email protected] 模块,而此时在 node_modules 中已经存在了 [email protected],因此安装后的目录结构是这样的:
现在继续安装一个模块 [email protected],它有如下依赖: 其实 [email protected] 已经存在了,只是它位于 [email protected] 模块下, 安装完成后目录结构变为了:
这个时候 [email protected] 又存在了两份。Ok,继续安装一个模块 [email protected],它的依赖关系如下: 这个时候因为 [email protected] 已经存在于项目根目录下的 node_modules 中了,因此目录结构是这样的:
npm v3 去重好了,这个时候突然 [email protected] 需要升级到 2.0.0 版本,依赖关系也变为了: 安装后目录结构变为了:
随后 F 模块也升级至 2.0.0 版本了,依赖关系也变为了: 执行安装,在这个过程中首先会移除掉,[email protected] 然后发现,[email protected] 已经没有模块依赖它了,因此也移除了 [email protected],然后安装 [email protected],并安装其依赖 [email protected],发现项目根目录的 得到目录结构为:
坑爹呢,[email protected] 存在了很多个副本了。但也不要紧张,通常 npm 会利用链接来将多个副本指向同一个模块。这样的目录结构虽然觉得有些浪费,但是对代码运行没有丝毫影响。也许你想让他好看一点,没有问题,执行命令:
该命令会遍历模块依赖树,根据模块之间的依赖关系,移动模块的位置,去除重复,让整个 node_modules 的目录结构更加扁平一些。
目录结构的不确定性模块的安装次序决定了 安装 A 和 C 的次序不同得到的 只有在手动使用 |
系列文章
The text was updated successfully, but these errors were encountered: