npm包 安装原理 及 常见报错(全局安装 和 本地安装有区别)

一、npm包全局安装:https://blog.csdn.net/wu_xianqiang/article/details/89667543

  需要注意的是,全局模式并不是将一个模块包安装为一个全局包的意思,它并不意味着可以从任何地方通过 require() 来引用到它

  事实上,全局的包 在项目中根本 不能引入使用。

  【假设:如果可以使用,在项目的package.json文件中根本没有这个包,代码提交后。换个环境下载下来后,全局包不存在就报错了】

  1、全局模式这个称谓其实并不精确,存在诸多误导。实际上, -g 是将一个包安装为 全局可用的可执行命令。它根据包描述文件中的 bin 字段配置,

     将实际脚本链接【win系统的连接,应该是通过.cmd文件实现的】到与Node可执行文件相同的路径下【即.cmd文件放在node程序同一目录下】:

"bin": {
"express": "./bin/express"
},

二、npm包 本地 安装:就是在项目下的 node_module 安装相应的包。项目中可以直接调用。具体的流程看下面的 介绍。

  1、npm install 包名:下载指定的npm包。

     a、从指定的源上下载这个 包,命令行上指定源,这种方式只是临时用 从 这个源上下载。https://www.cnblogs.com/ivan0626/p/6668336.html    如下:

    npm install node-sass --registry=http://registry.npm.taobao.org

  2、npm install :下载package.json 中所有的包。

三、npm install 安装过程分析:https://www.cnblogs.com/everlose/p/12505245.html  或 https://blog.csdn.net/qiwoo_weekly/article/details/103839779(有流程图,文档详细)

  下面写下 关键 流程步骤,细节的先不管

  1、首先检查 .npmrc 文件。(这个文件就是npm的配置文件)

    优先级为:项目级的 .npmrc 文件 > 用户级的 .npmrc 文件> 全局级的 .npmrc 文件 > npm 内置的 .npmrc 文件

    说明:检测 .npmrc配置文件的目的是,应该是 确定从哪里去下载 相应的包。【个人分析的,没有查到文档有这个说明。】

  2、检查项目中有无 lock 文件。

    若无 lock 文件:从远程获取 包信息,构建依赖树。 看 文档 https://www.cnblogs.com/everlose/p/12505245.html

    若有 lock 文件:和 package.json 不冲突,本身就是一个依赖树。可以跳过 构建依赖树的过程,到下一步。

  3、检测缓存中是否有包:

    a、缓存中有,直接把包解压 到 当前项目的node_modules目录。

    b、无缓存:从 npm 远程 仓库下载安装 包

  3、下载安装 包:https://blog.csdn.net/Alive_tree/article/details/101014999

    a、下载压缩包,放在~/.npm目录。【这里下载应该会根据】

    b、将压缩包放到缓存中,并 解压压缩包到当前项目的node_modules目录。

    注意,一个模块安装后,本地其实保存了两份,一份是~/.npm下的压缩包,另一份是node_modules目录下解压后的代码。在npm install运行的时候,只会检查node_modules中的模块,而不会检查/.npm.也就是说,如果在/.npm中有压缩包但是node_modules中没有模块,npm install会从远程仓库再下载一次压缩包。

 

四、.npmrc 配置文件:

  1、.npmrc 文件的作用:https://www.jianshu.com/p/5a1bc7123f31

  2、npm安装私有仓库npm包:https://blog.csdn.net/huzhenv5/article/details/107999532(两种方案) 或 https://segmentfault.com/q/1010000014649247

     说明:实现的功能是 npm install 时,大部分包都是从外网下载,公司内部 的包从内网下载

  3、如果某个包 安装,只是临时的配置。可以直接在npm 命令上,通过参数设置,而不需要设置 .npmrc文件。如,源的设置、信息显示的等级

五、包的组织【包的scope】:https://www.nps.ink/443589.html(为指定组织下的包 配置数据源 .npmrc配置) 或 https://blog.csdn.net/u013727805/article/details/80849329

六、package.json 自定义 包的 下载地址:https://www.cnblogs.com/tzyy/p/5193811.html(package.json属性详解)

  1、package.json 中 包 支持自定义 的下载路径有很多。如:urls、git urls【ssh 或 http】、github、Local Paths【本地路径也是可以的】。

    • urls:在版本范围的地方可以写一个url指向一个压缩包。注意是压缩包,而不是远程npm源的包信息。包信息里面有 对应的 压缩包地址【一般都是tar包】。
    • git urls:也可以指明 对应的 分支。
    • 其他的看文档。

  注意:npm仓库源上,每个包都有对应的包信息 文件(也是是一个json文件)。通过 npm info 也可以看到 包的信息,如:npm info axios。

       在没有 package-lock.json 时,npm install 时,构建模块依赖树。就要通过包信息来实现。

七、npm install 安装包的几种方式:【npm install安装的方式和package.json中信息是一致的】https://juejin.cn/post/6956025049254428680#heading-2

  • 包名安装:
    npm i react : 默认安装 react模块 latest 标签上的最新版本
  • 包名加版本:
    npm i react@16.8.1 : 安装 react模块16.8.1的版本
  • 包名加 tag:
    npm i react@next : 安装 react模块 next 标签上的最新版本
  • tarball url:
    npm i https://registry.npmjs.org/react/-/react-16.8.1.tgz      # 安装 react模块16.8.1的版本
  • tarball file:
    npm i file: xxxx.xxx.tgz    # tarball file 可以通过 npm pack 命令得到

    直接 install 包 也可以的(推荐下面这种)。   http://cuketest.com/zh-cn/shared/npm_offline

    npm i xxxx.xxx.tgz
  • git url:
    npm i git+https://github.com/facebook/react.git
  • username/project:
    npm i github:facebook/react

     注意:npm包有的依赖包因为文件较大,一般不会放在npm仓库,而是放在GitHub上,如 node-sass的 binding.node 二进制文件就是放在 GitHub上下载的。

八、package-lock.json 讲解:为什么 每次 npm install 时,package-lock.json文件就会改变。

  1、package.json 中 包 的信息是可以手动修改的,比如版本范围、包的地址等。所以npm install 时,package-lock.json 会 package.json做个比较看是否会冲突。

     在不冲突时,直接使用 package-lock.json 下载定义的包。而 不需要 再去 构建 依赖树。

  2、package-lock.json 本身的架构就是 一直 依赖树的 结构。所以可以直接下载对应的包。

九、 npm命令 调整日志等级:https://www.cnblogs.com/k4nz/p/14238164.html 或 https://blog.csdn.net/john987321456/article/details/112183317 或

     https://blog.csdn.net/weixin_40599109/article/details/108005531(里面有说明等级参数的  几个 快捷方式,如 --verbose)

   如:npm install 安装时,显示更多的信息:https://segmentfault.com/q/1010000002726783

npm install --verbose    #debug 级别的,显示的信息太多。这个--verbose 是参数的快捷方式一般日志等级的参数都是 --loglevel http 这种写法的
npm i axios --save --loglevel http     #  --loglevel参数,设置当前命令 日志 输出的等级。

     上面两个都是在当前命令上设置 这个日志 等级【日志,一般都是当前命令 看下 日志,不会全局去设置】,也可以在全局上设置 日志等级。

npm config set silent true

十、npm 缓存:https://blog.csdn.net/liuyan19891230/article/details/103856130(看缓存那一块)

  1、清除缓存 好像 不让用,试过几次都不成功。但是可以通过 设置 优先使用网络数据

  2、使用网络数据:添加参数  --prefer-online


npm 下载包常见的 问题 及 解决

一、node-sass 下载安装 失败:node-sass 国内下载报错的 概率是相当高。基本新环境的电脑,国内100%会出现这个问题。

  参考:https://www.cnblogs.com/Qooo/p/14021354.html(有说明原因)或 https://blog.csdn.net/weixin_44653329/article/details/103827492 或 https://www.w3cschool.cn/article/29315017.html

  1、node-sass 安装步骤 分析:

  1. 校验本地node_modules中是否已安装node-sass,版本是否一致;
  2. 如未安装或版本不符,从npm源安装node-sass本体;
  3. 检测全局缓存和本地中是否有binding.node,如有即跳过安装;
  4. 没有binding.node则从github下载该二进制文件并将其缓存到全局;
  5. 假如binding.node下载失败,则尝试本地编译出该文件;
  6. 将版本信息写到package-lock.json;

  由此看到,实际上node-sass依赖了一个二进制文件binding.node,从npm源安装完本体后还会从github下载binding.node。

  2、因此 安装 失败原因有以下几种:

     原因一:npm源速度慢:国外npm源速度慢,可以使用 淘宝镜像源。改变了npm源,node-sass 包的 下载 快了。但是 binding.node 包 默认是从github下载的,不是

             从npm源上下载的。所以 只是 改变 npm 的源,node-sass包 还是会 出现 安装失败的可能,还需要改变 node-sass包的下载路径。

       原因二:binding.node源无法访问或速度慢:node-sass除了npm部分的代码,还会下载二进制文件binding.node,默认源是github,

                          国内访问较慢,特殊时期甚至无法访问。我们也可以将其改成国内源。

        解决办法:把 binding.node 源设置 国内的淘宝镜像的源。  https://blog.csdn.net/qq_42514643/article/details/107872136

npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/  #安装时 使用,临时使用一次

        或【推荐这种方式设置

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/    #npm上全局配置,也可以手动写到.npmrc文件中。

        或 【不推荐这种,电脑重启后,设置的环境变量没有了。不知道是不是告诉电脑没有管理员权限的问题导致的】

set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ #亲测有效,设置环境变量。说明 binding.node的源地址,可以从环境变量上取值。

      注意:国内 基本都是这个原因 导致的 安装 失败。 当然 直接把 文件下载下来,把 sass_binary_site 指向本地路径也是可以的。

  3、类似问题的npm包 还有:chromedriver,phantomjs,electron等。    https://blog.csdn.net/weixin_44653329/article/details/103827492

     原因三:由于nodejs版本高导致node-sass安装不了:解决办法参考文档

       原因四:缓存中binding.node版本不一致:   参考文档

    原因五:安装失败后重新安装:安装失败后重新安装,有可能无权限删除已安装内容,此时npm uninstall node-sass或手动删掉原目录后再安装即可。

       原因六:提示没有安装python、build失败:假如拉取binding.node失败,node-sass会尝试在本地编译binding.node,过程就需要python。

            1、node-sass 拉取 binding.node 失败。就会 尝试在本地编译 binding.node。

         本地编译 binding.node 就需要 python 环境。

 

  1. 下载压缩包,放在~/.npm目录
  2. 解压压缩包到当前项目的node_modules目录
posted @ 2020-09-12 09:34  吴飞ff  阅读(2822)  评论(0编辑  收藏  举报