美文网首页
NPM---Node 包管理器

NPM---Node 包管理器

作者: 看远方的星 | 来源:发表于2023-01-22 20:40 被阅读0次

    npm(“Node 包管理器”)是 JavaScript 运行时 Node.js 的默认程序包管理器。[1]

    npm 由两个主要部分组成:

    • 用于发布和下载程序包的 CLI(命令行界面)工具
    • 托管 JavaScript 程序包的 在线存储库

    为了更直观地解释,我们可以将存储库 npmjs.com 视为一个物流集散中心,该中心从卖方(npm 包裹的作者)那里接收货物的包裹,并将这些货物分发给买方(npm 包裹的用户)。

    为了促进此过程,npmjs.com 物流集散中心雇用了一群勤劳的袋熊(npm CLI),他们将被分配给每个 npmjs.com 用户作为私人助理。 因此,dependencies(依赖项)会如下传递给 JavaScript 开发人员:

    image

    发布 JS 软件包的过程如下:

    image

    package.json

    每个 JavaScript 项目(无论是 Node.js 还是浏览器应用程序)都可以被当作 npm 软件包,并且通过 package.json 来描述项目和软件包信息。

    我们可以将 package.json 视为快递盒子上的运输信息。

    当运行 npm init 初始化 JavaScript/Node.js 项目时,将生成 package.json文件,文件内的内容(基本元数据)由开发人员提供:

    • name:JavaScript 项目或库的名称。
    • version:项目的版本。通常,在应用程序开发中,由于没有必要对开源库进行版本控制,因此经常忽略这一块。但是,仍可以用它来定义版本。
    • description:项目的描述。
    • license:项目的许可证。

    npm scripts

    package.json 还支持一个 scripts 属性,可以把它当作在项目本地运行的命令行工具。例如,一个 npm 项目的 scripts部分可能看起来像这样:

    {
      "scripts": {
        "build": "tsc",
        "format": "prettier --write **/*.ts",
        "format-check": "prettier --check **/*.ts",
        "lint": "eslint src/**/*.ts",
        "pack": "ncc build",
        "test": "jest",
        "all": "npm run build && npm run format && npm run lint && npm run pack && npm test"
      }
    }
    

    eslintprettiernccjest 不是安装为全局可执行文件,而是安装在项目本地的 node_modules/.bin/ 中。

    最新引入的 npx 使我们可以像在全局安装程序一样运行这些 node_modules 项目作用域命令,方法是在其前面加上 npx ...(即npx prettier --write ** / *。ts)。

    package-lock.json

    该文件描述了 npm JavaScript 项目中使用的依赖项的确切版本。如果 package.json 是通用的描述性标签,则 package-lock.json 是成分表。

    就像我们通常不会读取食品包装袋上的成分表(除非你太无聊或需要知道)一样,package-lock.json 并不会被开发人员一行一行进行读取。

    package-lock.json 通常是由 npm install 命令生成的,也可以由我们的 NPM CLI 工具读取,以确保使用 npm ci 复制项目的构建环境。

    dependencies vs devDependencies

    devDependencies 里面的插件只用于开发环境,不用于生产环境,而 dependencies 是需要发布到生产环境的。[2]

    这两个以键值对象的形式出现,其中 npm 库的名称为键,其语义格式版本为值。 大家可以看看 Github 的 TypeScript 操作模板中的示例:

    {
      "dependencies": {
        "@actions/core": "^1.2.3",
        "@actions/github": "^2.1.1"
      },
      "devDependencies": {
        "@types/jest": "^25.1.4",
        "@types/node": "^13.9.0",
        "@typescript-eslint/parser": "^2.22.0",
        "@zeit/ncc": "^0.21.1",
        "eslint": "^6.8.0",
        "eslint-plugin-github": "^3.4.1",
        "eslint-plugin-jest": "^23.8.2",
        "jest": "^25.1.0",
        "jest-circus": "^25.1.0",
        "js-yaml": "^3.13.1",
        "prettier": "^1.19.1",
        "ts-jest": "^25.2.1",
        "typescript": "^3.8.3"
      }
    }
    

    这些依赖通过带有 --save--save-dev 标志的 npm install 命令安装。 它们分别用于生产和开发/测试环境。 在下一节中,我们将更深入地研究这些软件包的安装。

    同时,理解语义版本前面的符号非常重要(假设你已经阅读 semvermajor.minor.patch 模型):

    • ^:表示最新的次版本,例如, ^1.0.4 可能会安装主版本系列 1 的最新次版本 1.3.0
    • :表示最新的补丁程序版本,与 ^ 类似, 〜1.0.4 可能会安装次版本系列 1.0 的最新次版本1.0.7

    所有这些确切的软件包版本都将记录在 package-lock.json 文件中。

    npm install

    这是现在我们开发 JavaScript/Node.js 应用程序时最常用的命令。

    默认情况下,npm install <package-name> 将安装带有 ^ 版本号的软件包的最新版本。npm 项目上下文中的 npm install 将根据 package.json 规范将软件包下载到项目的 node_modules 文件夹中,从而升级软件包的版本(并重新生成 package-lock.json )。 npm install <package-name> 可以基于 ^ 版本匹配。

    如果要在全局上下文中安装程序包,可以在机器的任何地方使用它,则可以指定全局标志 -g(例如 live-server)。

    npm i module_name  -S  = >  npm install module_name --save    写入到 dependencies 对象
    
    npm i module_name  -D  => npm install module_name --save-dev   写入到 devDependencies 对象
    
    npm i module_name  -g  全局安装
    

    参考文章


    1. 什么是 npm —— 写给初学者的编程教程

    2. npm -i 与npm install -s与-d的区别

    相关文章

      网友评论

          本文标题:NPM---Node 包管理器

          本文链接:https://www.haomeiwen.com/subject/ttzkhdtx.html