zoukankan      html  css  js  c++  java
  • npm知识总结

    本文主要解决以下几个问题:

    1. package.json中的dependenciesdevDependencies的区别是啥,peerDependenciesbundledDependenciesoptionalDependencies又是啥?
    2. 为什么有的命令写在package.json中的script中就可以执行,但是通过命令行直接执行就不行?
    3. 为什么需要package-lock.json文件?
    4. 一个包在项目中有可能需要不同的版本,最后安装到根目录node_modules中的具体是哪个版本?

    name & version

    如果想要发布一个npm包,nameversion属性是必须的。他们两个组合会形成一个唯一的标识来表名当前包。以后每更新一次包,version就需要进行相应的更改。如果你不打算发布包,只想在本地使用,这两个字段不是必须的。

    name字段命名的规则如下:

    • 长度不能超过214个字符(对于有scoped的包,该限制包括scoped字段)(什么是Scoped packages?

    • 有作用域的包名字可以以.或者_开头,没有作用域限制的不可

    • 不能含有大写字母

    • 不能含有非URL安全的字符

    version字段

    版本号需要符合semver(语义化版本号)规则,具体版本格式为:主版本号.次版本号.修订号, 如1.1.0。

    • 主版本号(major):做了不兼容的 API 修改

    • 次版本号(minor):做了向下兼容的功能性新增

    • 修订号(patch):做了向下兼容的问题修正

    当有一些先行版本需要发布时,可以在主版本号.次版本号.修订号之后加上一个中划线和标识符如alpha(内部版本)、beta(公测版本)、rc(候选版本)等来表明。

    以vue的版本为例:

    • 最新的稳定版本:3.0.5

    • 最新的rc版本:3.0.0-rc.13

    • 最新的beta版本:3.0.0-beta.24

    • 最新的alpha版本:3.0.0-alpha.13

    可以通过npm install semver来检查一个包的命名是否符合semver规则。

    dependencies & devDependencies 

    dependenciesdevDependencies大家应该都不陌生,通过npm install xx --save安装的包会写入dependencies中,通过npm install xx --save-dev安装的包会写入devDependencies

    dependencies中的包是生产环境的依赖,属于线上代码的一部分,比如vueaxiosveui等。devDependencies中的包是开发环境的依赖,只是在本地开发的时候需要依赖这里的包,比如 vue-loadereslint等。

    我们平时用的npm install命令既会安装dependencies中的包,也会安装devDependencies中的包。如果只想安装dependencies中包,可以使用npm install --production或者将NODE_ENV环境变量设置为production,通常在生成环境我们会这么用。

    需要注意的是,一个模块会不会被打包取决于我们在项目中是否引入了该模块,跟该模块放在dependencies中还是devDependencies并没有关系。

    对于我们的项目来说,把用到的包写在dependencies或者devDependencies并没有什么区别。但要是做为一个包发到npm上时,写在devDependencies中的依赖不会被下载。

    peerDependencies & bundledDependencies & optionalDependencies

    这三个属性在平时我们的项目开发中都用不到。不同于dependencies & devDependencies面向的是包的使用者,peerDependencies & optionalDependencies & bundledDependencies这三个属性是面向包的发布者。
     

    scripts 

    定义在scripts中的命令,我们通过npm run <command>就可以执行。npm run <command>npm run-script <command>的简写。如果不加command,则会列出当前目录下可执行的所有脚本。

    teststartrestartstop这几个命令执行时可以不加run,直接npm testnpm startnpm restartnpm stop调用即可。

    env是一个内置的命令,可以通过npm run env可以获取到脚本运行时的所有环境变量。自定义的env命令会覆盖内置的env命令。

    package-lock.json

    对于npmpackage.json文件可以看成它的输入,node_modules可以做为它的输出。在理想情况下,npm应该是一个纯函数,无论何时执行相同的package.json文件都应该产生完全相同的node_modules树。在一些情况下,这确实可以做到。但是在大多情况下,都实现不了。主要有以下几个原因:

    • 使用者的npm版本有可能不同,不同的npm版本有着不同的安装算法

    • 自上次安装之后,有些符合semver-range的包已经有新的版本发布。这样再有别人安装的时候,会安装符合要求的最新版本。比如引入vue包:vue:^2.6.1。A小伙伴下载的时候是2.6.1,过一阵有另一个小伙伴B入职在安装包的时候,vue已经升级到2.6.2,这样npm就会下载2.6.2的包安装在他的本地

    • 针对第二点,一个解决办法是固定自己引入的包的版本,但是通常我们不会这么做。即使这样做了,也只能保证自己引入的包版本固定,也无法保证包的依赖的升级。比如vue其中的一个依赖lodashlodash:^4.17.4,A下载的是4.17.4, B下载的时候有可能已经升级到了4.17.21

    为了解决上述问题,npm5.x开始增加了package-lock.json文件。每当npm install执行的时候,npm都会产生或者更新package-lock.json文件。package-lock.json文件的作用就是锁定当前的依赖安装结构,与node_modules中下所有包的树状结构一一对应。

    有了这个package-lock.json文件,就能保证团队每个人安装的包版本都是相同的,不会出现有些包升级造成我这好使别人那不好使的兼容性问题。

  • 相关阅读:
    【洛谷3778】[APIO2017] 商旅(分数规划+Floyd)
    【AT4114】[ARC095D] Permutation Tree(简单题)
    【AT4352】[ARC101C] Ribbons on Tree(容斥+DP)
    【AT4169】[ARC100D] Colorful Sequences(DP)
    【洛谷4581】[BJOI2014] 想法(随机算法)
    【洛谷5659】[CSP-S2019] 树上的数(思维)
    【AT4439】[AGC028E] High Elements(线段树)
    【CF590E】Birthday(AC自动机+二分图匹配)
    【洛谷4298】[CTSC2008] 祭祀(Dilworth定理+二分图匹配)
    【洛谷3774】[CTSC2017] 最长上升子序列(杨表)
  • 原文地址:https://www.cnblogs.com/magicg/p/15723630.html
Copyright © 2011-2022 走看看