草庐IT

你不一定知道的npm那些知识

该帐号已被查封_才怪 2023-10-25 原文

一、显示npm install 详细信息

按照如下设置后,可以在npm install 后查看每一个步骤,方便查看安装的详细信息,对出现异常情况排查原因非常有用,比如,可以清楚的知道安装某个包时具体卡在什么环节等。

1、显示info级别信息

推荐设置这个级别就可以了
npm config set loglevel info


image.png

2、显示verbose级别信息

这个级别比info级别更详细
npm config set loglevel verbose

image.png

3、显示其他级别信息

https://docs.npmjs.com/misc/config#loglevel

image.png

二、查看项目某个库或所有库的版本号及依赖关系

1、查看某个库的版本号及依赖关系
npm ls 包名

//  查看 base64-js版本及依赖关系
npm ls base64-js
image.png

2、查看项目所有库版本及依赖关系

// 查看所有依赖的版本(当前项目)
npm ls
// 查看所有依赖的版本(全局 非当前项目)
npm ls -g
// 查看所有一级依赖的版本
npm ls --depth 0  或 npm ls --depth=0
// 查看所有一级依赖及二级依赖的版本
npm ls --depth=1 或 npm ls --depth 1
// 查看所有三级依赖及三级依赖的版本
npm ls --depth=3 或 npm ls --depth 3
image.png

3、查看项目dependencies或devDependencies所有库版本及依赖关系

// 查看所有dependencies一级依赖的版本
npm list -depth 0 -prod true
// 查看所有devDependencies一级依赖的版本
npm list -depth 0 -dev true

三、库版本解释

image.png

库版本解释 截图自: 2018 年了,你还是只会 npm install 吗?

四、锁定库版本

1、通过prefix控制(信息来源:npm-shrinkwrap锁定依赖

当运行 npm update 时,

  • a、^1.5.1 【限制主版本号】允许安装版本号大于 1.5.1 但小于 2.0.0 版本的模块
    npm默认采用这种方式

  • b、~1.5.1 【限制次要版本】 允许安装版本号大于 1.5.1 但小于 1.6.0 版本的模块
    可通过 npm config set save-prefix="~"将默认的^修改为~

  • c、1.5.1 【精确控制】允许安装版本号大于 1.5.1
    可通过npm config set save-exact true 将默认的^取除掉

在此个人推荐采用~1.5.1的方式;

2、通过package-lock.json控制

npm 5.0+ 后 npm install时会自动创建package-lock.json文件;package-lock.json的出现,npm install规则发生了三次变化:(信息来源: npm install 生成的package-lock.json是什么文件?有什么用?

  • a、 npm 5.0.x版本
    不管package.json怎么变化,npm install 都会根据package-lock.json 文件下载;

  • b、 npm 5.1.0+版本
    npm install会无视package-lock.json, 根据package.json下载,也就是package.json的权限会高于package-lock.json;

  • c、 npm 5.4.2+版本
    npm install时 如果package.json与package-lock.json不一致,则根据package.json的语法规则进行下载;如果一致时,则都会根据package-lock.json下载;

  • 补充知识 : npx 是在npm 5.2.0+版本支持的 http://www.ruanyifeng.com/blog/2019/02/npx.html

3、通过shrinkwrap控制 (信息来源:npm-shrinkwrap锁定依赖

  • 步骤1、如果不能保证package.json文件定义的依赖与node_modules下已安装的依赖是匹配、无冗余的,建议执行 清理依赖并重新安装(rm -rf node_modules && npm install )或者精简依赖--移除无关的包(npm prune )

  • 步骤2、npm shrinkwrap 运行后,如果原来有package-lock.json文件的,将单纯的重命名为npm-shrinkwrap.json

  • 步骤3、npm install 后,记得运行 npm shrinkwrap 以便更新npm-shrinkwrap.json文件

也就是使用shrinkwrap控制库版本时需要执行三条命令;

package-lock.json与npm-shrinkwrap.json的作用类似,但是区别如下:

a、如果根目录下同时存在这两个文件,则以npm-shrinkwrap.json为准;
b、npm-shrinkwrap.json在npm v2、npm v3、npm v4 就已经支持了,但是package-lock.json 仅在npm v5+及以后才支持;
c、npm-shrinwkrap.json 可以被包含到发布包,而 package-lock.json 不行,保证用户可以自由管理依赖包;

4、弃用npm,采用yarn;

五、查看npm配置信息

1、查看简要信息 npm config list

image.png

2、查看所有信息 npm config list -l

六、清除npm包缓存

1、删除 node_modules及package-lock.json;
2、执行 npm cache clean --force 删除所有缓存 (其实清的是 ~/.npm/_cacache文件夹中的数据-https://github.com/sliwey/blog/issues/1),如果你本地有多个项目,不是很推荐这种做法(因为可能其他项目可能用到了这里面的缓存了) 推荐采用下面一点 七、某个项目不使用npm公共缓存

七、某个项目不使用npm公共缓存

1、先查看该项目的npm缓存目录在哪里
可以通过npm config get cache查看当前npm的缓存在哪里;下图说明在npm公共缓存目录中

image.png

2、在该项目根目录下创建.npmrc文件,并在该文件中写入

cache=.npm

3、确认npm缓存目录在哪里,如下图这么显示说明成功了

image.png

参考:http://claude-ray.com/2019/12/06/npm-install-without-cache/

八、使用淘宝镜像

这个大家应该都知道,不解释了

npm install -g cnpm --registry=https://registry.npm.taobao.org

npm config set registry https://registry.npm.taobao.org 设置淘宝镜像

npm config set registry https://registry.npmjs.org/ 设置原始npm源

推荐安装使用nrm来管理源

九、npm 其他知识

1、升级npm
npm install npm@latest -g
2、使用npx 执行某个插件 (如果项目中没有,则安装最新的插件)
npx uglify-js -v
npx uglify-js -m -- test.js >>yasuo.js
npx webpack -v
npx node@10 -v npx node@12 -v 可以避免使用nvm之类的工具
3、npm install xx -g 后安装目录可以通过 npm root -g查看。例如 Windows上的为 C:\Users\你的用户名\AppData\Roaming\npm\node_modules
4、查看npm包详细信息 npm view 包名

image.png

5、查看所有可以版本
npm view 包名 versions
image.png

6、查看当前项目可以的新版本npm outdated
image.png

7、查看全局安装的npm包
npm list -g --depth 0

+-- @vue/cli@4.5.12
+-- browser-sync@2.26.13
+-- browserify@17.0.0
+-- cnpm@6.1.1
+-- conventional-changelog@3.1.24
+-- conventional-changelog-cli@2.1.1
+-- documentation@13.2.5
+-- f2elint@1.2.0
+-- gulp@4.0.2
+-- jsdoc@3.6.7
+-- lerna@4.0.0
+-- mp-cli-lc@3.0.1
+-- mrm@2.6.1
+-- nodemon@2.0.6
+-- nrm@1.2.1
+-- pm2@4.5.5
+-- rimraf@3.0.2
+-- rollup@2.53.1
+-- spy-debugger@3.8.6
+-- ts-node@10.0.0
+-- typescript@4.3.2
+-- verdaccio@4.12.0
+-- whistle@2.5.30
standard-version

image.png

8、如果安装的模块依赖了c++,则安装过程中会隐性安装node-gyp,node-gyp可以编译这些依赖c++模块的模块,但是node-gyp在首次编译时会依赖node源码,所以又会去悄悄去下载node,虽然安装时设置了淘宝镜像,但是此时是无效的,可以使用 disturl 来解决 npm config set disturl https://npm.taobao.org/mirrors/node/
9、node-sass安装时会从github上下载一个叫binding.node的文件,而github releases里的文件都托管在亚马逊的服务器上,导致国内无法访问,因此可以使用 sass_binary_site 来解决 npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/,类似的情况还有很多:

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm config set sharp_dist_base_url https://npm.taobao.org/mirrors/sharp-libvips/
npm config set electron_mirror https://npm.taobao.org/mirrors/electron/
npm config set puppeteer_download_host https://npm.taobao.org/mirrors/
npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/
npm config set sentrycli_cdnurl https://npm.taobao.org/mirrors/sentry-cli/
npm config set sqlite3_binary_site https://npm.taobao.org/mirrors/sqlite3/
npm config set python_mirror https://npm.taobao.org/mirrors/python/

此外,node-sass版本与node版本相关联:


image.png

使用nvm或n 进行版本切换时,可能会出现binding.node匹配不到的情况,此时可通过

npm cache clean -f
npm rebuild node-sass 或 删除node_modules及package-lock.json 文件重新安装

类似node-sass从国外服务器下载东西还有很多 ,有时需要在Github上克隆一份该模块的源码进行分析,搜索包含base、binary、cdn、config、dist、download、host、mirror、npm、site、url等这样的关键词(自行探索,通常「mirror」的匹配度最高) https://mp.weixin.qq.com/s/u4oI_tdYDIFQeTPSifCt7g#

10、在项目中新增一个重装的指令
rimraf 是一个node版的 rm -rf
npm i -g rimraf

{
  "scripts": {
    "reinstall": "rimraf node_modules &&  rimraf   package-lock.json && npm i"
  }
}

11、依赖相同的包的安装机制
如:A和B包都依赖C,那么C会因npm版本的不同安装至不同的目录。如果npm版本为2及以下,则是


image.png

如果npm版本为3及以上,
image.png

若碰到依赖的版本不同会怎么样呢?
假设A、B 依赖D (v0.0.1),C依赖D(v0.0.2):
image.png

如果C的顺序在A,B的前面(npm intsall时 package.json 里依赖的顺序会依次解析)


image.png

推荐看这篇文章:https://www.zoo.team/article/npm-details

12、依赖类型的区别

  • a、dependencies
    生成环境及开发环境的依赖
  • b、devDependencies
    开发环境依赖
  • c、optionalDependencies
    可选的依赖包,(可有可无的依赖)
  • d、peerDependencies
    同等依赖,必须先安装某些包,如ant-design@3.x的配置如下
"peerDependencies": { 
  "react": ">=16.9.0", 
  "react-dom": ">=16.9.0" 
 }, 
  • e、bundledDependencies
    捆绑依赖包

13、需要修改某个npm包,但不想联系作者修改/发起pull request或者自己下载代码下来修改完后再发布npm

可以使用patch-package npm包,在安装完这个npm包后,在package.json中的script添加"postinstall": "patch-package",然后修改你想要修改的npm包源码文件(在项目根目录node_modules文件夹里),然后执行npx patch-package 你想要修改的npm包名称,即可。详细步骤请见:使用patch-package定制node_modules 中的依赖包

十、推荐资料

1、[译]npm入门指南
2、npm-shrinkwrap锁定依赖
3、在JavaScript项目中锁定npm依赖包版本
4、 npm 官方文档 https://docs.npmjs.com/cli/v6/commands/npm-ls
5、 中文文档 https://www.npmjs.cn/getting-started/what-is-npm/
6、npm 模块安装机制简介 http://www.ruanyifeng.com/blog/2016/01/npm-install.html
7、手把手教你快速制作基于Element UI组件npm包 https://www.jianshu.com/p/b375e1eb549b

十一、 npm与yarn、pnpm及相关

(一) 由facebook及google支持的yarn

1、查看包引入
有时npm嵌套的太深,我们不知道某个包是怎么引进来的,这时我们可以使用 yarn why <package-name> 来查看它是谁引入的

(二) 由Zoltan Kochan 开发的pnpm

1、为什么现在我更推荐 pnpm 而不是 npm/yarn?
2、Zoltan Kochan--Why should we use pnpm?

(三) node 内置的npm

Node.js 16.9.0 开始内置Corepack其将默认支持pnpm、yarn包管理器

十二、 推荐网站

1、查看某个npm包被哪个npm包作为依赖引用了,例如handlebars包:
https://cnpmjs.org/package/handlebars

image.png

2、分析某个npm https://npm.devtool.tech/
例如查看cdn: https://npm.devtool.tech/cdn/handlebars

image.png

3、在线运行npm
https://npm.runkit.com/js-utils-lc

image.png

4、查看npm包的源文件
a. https://cdn.jsdelivr.net/npm/js-utils-lc/

image.png

b. https://www.jsdelivr.com/package/npm/js-utils-lc

image.png

c. https://npm.runkit.com/js-utils-lc

image.png

5、查看npm包下载量及对应的github等信息
a. https://openbase.com/js/js-utils-lc
b. https://snyk.io/advisor/npm-package/js-utils-lc

6、 引用最新的cdn
https://unpkg.com/js-utils-lc@latest/

十三、nvm注意事项

1 设置默认版本 nvm alias default v8.9.1
2 查看nvm安装的目录echo $NVM_DIR

十四、gulp v3.9 与Node12不兼容解决方案

使用Node 12 运行gulp 3.9时会报primordials is not defined 错误,可以在package.json加入如下代码解决(https://stackoverflow.com/questions/55921442/how-to-fix-referenceerror-primordials-is-not-defined-in-node-js)

{
  "scripts": {
    "preinstall": "npx npm-force-resolutions"
  },
  "resolutions": {
  "graceful-fs": "^4.2.10"
  }
}

以上亲测有效。(原理是npm-force-resolutions 可以控制依赖的依赖,有点类似yarn的 selective dependency
)
或者(以下方法待验证:https://blog.csdn.net/qq_22713201/article/details/122329418
1、项目根目录新建npm-shrinkwrap.json
2、npm-shrinkwrap.json内容修改如下:

{
  "dependencies": {
    "graceful-fs": {
        "version": "4.2.2"
     }
  }
}

十五、专门分析npm大小的网站

https://bundlejs.com/

十六、npm下载量对比分析

https://npmtrends.com
例如:/angular-vs-react-vs-vue

image.png

有关你不一定知道的npm那些知识的更多相关文章

  1. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  2. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  3. ruby - EventMachine - 你怎么知道你是否落后了? - 2

    我正在研究使用EventMachine支持的twitter-streamruby​​gem来跟踪和捕获推文。我对整个事件编程有点陌生。我如何判断我在事件循环中所做的任何处理是否导致我落后?有没有简单的检查方法? 最佳答案 您可以通过使用周期性计时器并打印出耗时来确定延迟。如果您使用的是1秒的计时器,您应该已经过了大约1秒,如果它更长,您就知道您正在减慢react器的速度。@last=Time.now.to_fEM.add_periodic_timer(1)doputs"LATENCY:#{Time.now.to_f-@last}"@

  4. ruby-on-rails - Ruby 如何知道在哪里可以找到所需的文件? - 2

    这里还有一个新手问题:require'tasks/rails'我在每个Rails项目的根路径中的Rakefile中看到了这一行。我猜这行用于要求vendor/rails/railties/lib/tasks/rails.rb加载所有rake任务:$VERBOSE=nil#LoadRailsrakefileextensionsDir["#{File.dirname(__FILE__)}/*.rake"].each{|ext|loadext}#LoadanycustomrakefileextensionsDir["#{RAILS_ROOT}/lib/tasks/**/*.rake"].so

  5. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  6. ruby - Ruby gems 的问题(损坏?)试图让指南针在 npm 中工作 - 2

    我不是Ruby专家,但想弄清楚发生了什么,因为我试图让指南针在节点应用程序中工作,但我的Ruby似乎坏了。打字:ruby--version让我:ruby2.1.1p76(2014-02-24revision45161)[x86_64-darwin13.0]我安装了Homebrew,之前遇到过Ruby版本的问题,但它似乎已安装并且可以正常工作。但是,当我使用gem输入请求时,出现此错误:$gem-hErrorloadingRubyGemsplugin"/Users/user_dir/.rvm/gems/ruby-2.1.1@global/gems/executable-hooks-1.3

  7. ruby - npm link 的 Ruby 类似物是什么? - 2

    如果您是Nodejs项目的源代码,则命令npmlink会以这样一种方式安装它:您所做的任何更改都适用于所有地方,而无需重新安装。npmlinkisdesignedtoinstalladevelopmentpackageandseethechangesinrealtimewithouthavingtokeepre-installingit.https://www.npmjs.org/doc/misc/npm-developers.html#link-packages是否有Ruby项目的类似物? 最佳答案 Ruby的等价物是在Gemfi

  8. ruby - 如何知道通过 ruby​​ 上传 ftp 是否成功? - 2

    下面的代码通过ftp上传文件并且它有效。require'net/ftp'ftp=Net::FTP.newftp.passive=trueftp.connect("***")ftp.login("***","***")ftp.chdir"claimsecure-xml-files"ftp.putbinaryfile("file.xls",File.basename("file.xls"))ftp.quit但是如何确定上传是否成功呢? 最佳答案 之后ftp.putbinaryfile("file.xls",File.basename("

  9. ruby - 为什么 Gemfile 语义版本控制运算符 (~>) 会产生与一个数字不一致的结果? - 2

    gemspec语义版本控制运算符~>(又名twiddle-wakka,又名pessimistic运算符)允许限制gem版本但允许进行一些升级。我经常看到它可以读作:"~>3.1"=>"Anyversion3.x,butatleast3.1""~>3.1.1"=>"Anyversion3.1.x,butatleast3.1.1"但是有了一个数字,这条规则就失效了:"~>3"=>"Anyversionx,butatleast3"*NOTTRUE!*"~>3"=>"Anyversion3.x"*True.Butwhy?*如果我想要“任何版本3.x”,我可以只使用“~>3.0”,这是一致的。就

  10. WebSocket的那些事(1-概念篇) - 2

    目录一、什么是Websocket二、WebSocket部分header介绍三、HTTPVSWebSocket四、什么时候使用WebSockets五、关于SockJS和STOMP一、什么是Websocket根据RFC6455标准,Websocket协议提供了一种标准化的方式在客户端和服务端之间通过TCP连接建立全双工、双向通信渠道。它是一种不同于HTTP的TCP协议,但是被设计为在HTTP基础上运行。Websocket交互始于HTTP请求,该请求会通过HTTPUpgrade请求头去升级请求,进而切换到Websocket协议。请求报文如下:GET/spring-websocket-portfoli

随机推荐