认识创建现代npm包的最佳实践

452 阅读22分钟

技术一直在变化,你的流程和实践也需要跟上这些变化。因此,虽然npm已经有12年的历史,但你围绕npm包创建的做法应该更现代。如果你觉得它们可能有点过时,请继续阅读。

在本教程中,我们将使用现代的最佳实践(截至2022年)一步一步地创建一个npm包。你将首先学习如何创建一个npm包,这样你就可以熟悉构建和发布一个包到npm注册表。然后,你将学习如何通过建立测试框架、持续集成和部署管道、安全检查以及发布的自动语义版本管理,来制作一个更健壮、可用于生产的npm包。在本教程结束时,你会对自己制作现代和可持续的npm包的能力感到自信。让我们开始吧

前提条件

  1. 熟悉Node.js、JavaScript、GitHub和GitHub Actions
  2. 可用来协助创建npm包的开发工具

简单的npm包例子

让我们先用一个简单的例子来熟悉一下创建和发布npm包的过程。如果你已经很熟悉了,你可以跳到涵盖更多高级主题的Production-ready npm package部分。

设置你的项目

你需要在GitHub上有一个项目才能开始,所以请按照以下步骤来启动一个项目。如果你已经有了一个项目,你可以跳到下一节,但一定要仔细检查本节中关于包名的第5步

  1. 创建一个GitHub仓库:https://github.com/new
  2. 克隆本地的 repo。
    例子git clone [https://github.com/clarkio/modern-npm-package.git](https://github.com/clarkio/modern-npm-package.git)
  3. 打开你的终端,改变目录到你克隆项目的文件夹。
    例子cd modern-npm-package
  4. 运行npm init -y 来创建一个package.json 文件。**注意:**如果你克隆了例子仓库,你就不需要做这一步。
  5. 用一个范围内的名称更新package.json 中的name 属性。
    例如: @clarkio/modern-npm-package 。请确保使用你的用户名或组织名称,而不是@clarkio
  6. 编写你的包的代码(或者只是使用index.js中的hello world例子)。

一旦你的项目被创建,你就可以继续创建一个npm账户。

设置一个npm账户

为了能够将你的npm包提供给其他人使用,你需要一个npm账户。下面的步骤将指导你创建自己的账户(如果你还没有的话),启用双因素认证(2FA)以提高账户的安全性,并将你的账户连接到你的本地机器。

  1. 通过npm注册,网址是www.npmjs.com/signup
  2. 为了提高安全性,在你的npm账户上启用2FAdocs.npmjs.com/configuring…
  3. 在你的终端中使用npm login 命令登录你的npm账户,并遵循屏幕上的指示。
> npm login
npm notice Log in on https://registry.npmjs.org/
Username: clarkio
Password:
Email: (this IS public) <email address>
npm notice Please use the one-time password (OTP) from your authenticator application
Enter one-time password from our authenticator app: <OTP>
Logged in as clarkio on https://registry.npmjs.org/.

如何发布你的npm包

一旦你有了npm项目和npm账户,你就可以把你的npm包发布到公共和官方的npmjs注册表上,使其可供他人使用了。以下是你要遵循的步骤,在执行之前检查将发布的内容,然后运行实际的发布过程。

  1. 在你的终端,运行npx npm-packlist ,查看将包含在发布版本的软件包中的内容。

    这可以确保你没有遗漏任何源代码文件,这些文件是你的软件包正常运行所需要的。这也是一个很好的做法,以确保你不会意外地将敏感信息泄露给公众,如带有数据库凭证或API密钥的本地配置文件。

> npx npm-packlist
LICENSE
index.js
package.json
README.md
  1. 在你的终端,运行npm publish --dry-run ,看看在实际运行该命令时会做什么。
> npm publish --dry-run
npm notice
npm notice 📦@clarkio/simple-npm-package@0.0.1
npm notice === Tarball Contents ===
npm notice 1.1kB LICENSE
npm notice 1.2kB README.md
npm notice 95B index.js
npm notice 690B package.json
npm notice === Tarball Details===
npm notice name: @clarkio/simple-npm-package
npm notice version: 0.0.1
npm notice filename:@clarkio/simple-npm-package-0.0.1.tgz
npm notice package size:1.7 kB
npm notice unpacked size: 3.1 kB
npm notice shasum:40ede3ed630fa8857c0c9b8d4c81664374aa811c
npm notice integrity:sha512-QZCyWZTspkcUXL... ]L60ZKBOOBRLTg==
npm notice total files:4
npm notice
+ @clarkio/simple-npm-package@0.0.1
  1. 在你的终端中,运行npm publish --access=public 来实际发布软件包到npm。**注意:**对于范围内的包(@clarkio/modern-npm-package),--access=public ,因为它们默认是私有的。如果它不是范围内的,并且在你的package.json 中没有将私有字段设置为true ,它也将是公开的。
> npm publish --access=public
npm notice
npm notice 📦@clarkio/simple-npm-package@0.0.1
npm notice === Tarball Contents ===
npm notice 1.1kB LICENSE
npm notice 1.2kB README.md
npm notice 95B index.js
npm notice 690B package.json
npm notice === Tarball Details===
npm notice name: @clarkio/simple-npm-package
npm notice version: 0.0.1
npm notice filename:@clarkio/simple-npm-package-0.0.1.tgz
npm notice package size:2.1 kB
npm notice unpacked size: 4.1 kB
npm notice shasum:6f335d6254ebb77a5a24ee729650052a69994594
npm notice integrity:sha512-VZ1K1eMFOKeJW[...]7ZjKFVAxLcpdQ==
npm notice total files:4
npm notice
This operation requires a one-time password.
Enter OTP: <OTP>
+ @clarkio/simple-npm-package@0.0.1

你已经完成了!你已经完成了构建和部署你自己的npm包。接下来,你将学习如何制作一个更强大的包,为生产环境做好准备,并被更广泛地使用。

生产就绪的npm包

虽然前面的例子包有可能在生产中使用,但它涉及到手动工作,以保持其长期的维护。使用工具和自动化以及适当的测试和安全检查将有助于最大限度地减少保持包顺利运行的总工作量。让我们深入了解一下这其中的内容。

下面的章节将涵盖。

  1. 为CommonJS(CJS)和ECMAScript(ESM)模块格式进行构建
  2. 设置和编写单元测试
  3. 实现安全检查
  4. 自动化版本管理和发布

为CommonJS和ECMAScript模块格式进行构建

虽然ECMAScript模块格式现在已经在Node.js的12+版本中得到原生支持,但它还没有被社区广泛采用。为了面向未来并支持这两种格式,你将看到使用TypeScript如何为它们准备你的npm包。

  1. 首先,创建一个基本的 TypeScript 配置文件,名称为tsconfig.base.json 。这是通用的编译设置,无论你的目标是哪种模块格式都可以使用。你可以根据你的项目的需要来调整这些,特别是你要调整files 属性以符合你的项目结构,如果你不使用所提供的例子。
{
  "compilerOptions": {
    "strict": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "skipLibCheck": true,
    "checkJs": true,
    "allowJs": true,
    "declaration": true,
    "declarationMap": true,
    "allowSyntheticDefaultImports": true
  },
  "files": ["../src/index.ts"]
}
  1. 然后为CommonJS格式创建一个TypeScript配置文件,并将其命名为tsconfig.cjs.json
    • lib 属性向TypeScript指出它应该引用什么类型来帮助你为你的项目编写代码。
    • target 属性向 TypeScript 指示了哪个 JavaScript 版本来编译你的项目代码。
    • module 属性向TypeScript指出在编译你的项目代码时应该使用哪种JavaScript模块格式。
    • moduleResolution 属性帮助 TypeScript 弄清楚一个 "导入 "语句应该如何被引用。
    • outDirdeclarationDir 属性向 TypeScript 指示将编译你的代码和定义其中使用的类型的结果放在哪里。
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "lib": ["ES6", "DOM"],
    "target": "ES6",
    "module": "CommonJS",
    "moduleResolution": "Node",
    "outDir": "../lib/cjs",
    "declarationDir": "../lib/cjs/types"
  }
}
  1. 之后,为ECMAScript格式创建一个TypeScript配置文件,并将其命名为tsconfig.esm.json 。这里的属性与你在CommonJS配置中看到的相同,但现在针对现代ECMAScript模块格式作为其输出。
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "lib": ["ES2022", "DOM"],
    "target": "ES2022",
    "module": "ESNext",
    "moduleResolution": "NodeNext",
    "outDir": "../lib/esm",
    "declarationDir": "../lib/esm/types"
  }
}
  1. 更新你的package.json 文件,加入一个files 字段,指向你的lib 文件夹,里面有TypeScript为你构建软件包的结果。
  2. 更新你的package.json 文件,增加一个exports 字段,以定义如何根据使用的模块加载器(CJS vs. ESM)找到源文件。
"exports": {
    ".": {
      "import": {
        "types": "./lib/esm/types/index.d.ts",
        "default": "./lib/esm/index.mjs"
      },
      "require": {
        "types": "./lib/cjs/types/index.d.ts",
        "default": "./lib/cjs/index.js"
      }
    }
  },
  1. 更新你的package.json 文件maintypes 字段,指向软件包的CJS版本。这是为了作为一个默认的、后备的选项。
“types": "./lib/cjs/types/index.d.ts",
"main": "./lib/cjs/index.js",
  1. 在你的package.json 文件中添加一个files 字段,以表明当npm打包你的代码进行发布时,哪些文件应该被包含。
"files": [
   "lib/**/*"
],
  1. 通过package.json 中的scripts 字段创建命令,使用tsc 并编译 CJS 和 ESM 格式的包。这将导致生成lib 文件夹的源文件。
    • clean 脚本是用来删除过去构建的输出,并从一个干净的地方开始。
    • build:esm 脚本末尾的mv lib/esm/index.js lib/esm/index.mjs 重命名了文件扩展名,以便 Node.js 模块加载器知道它是一个 ESM 模块。
    • prepack 脚本是由npm在打包npm包准备发布到注册表前使用的。
    "clean": "rm -rf ./lib",
    "build": "npm run clean && npm run build:esm && npm run build:cjs",
    "build:esm": "tsc -p ./configs/tsconfig.esm.json && mv lib/esm/index.js lib/esm/index.mjs",
    "build:cjs": "tsc -p ./configs/tsconfig.cjs.json",
    "prepack": "npm run build"
  1. 现在你可以在终端运行npm run build ,让TypeScript构建你的项目,为使用和发布做准备。

这就是你在使用TypeScript构建npm包时需要做的所有设置,它同时支持CommonJS和ECMAScript模块格式。接下来,你将学习如何设置和运行针对你的npm包代码的测试,以确保它产生你期望的结果。

设置和添加测试

为了对你的代码的行为和结果有信心,你将需要实施一个测试过程。测试迫使你在第一次创建代码时,在典型的、快乐的路径之外,以不同的方式思考你的代码的功能。举个例子,你可以想办法打破一个函数,使它抛出一个错误或产生一个非预期的结果。这样做将使你的应用程序更有弹性和可持续性,并确保在添加更多内容时不会出现问题。

单元测试

确保你的包以你想要的方式表现,需要针对你的代码编写测试。你需要一些工具来帮助设置你的项目来运行单元测试并显示结果。这些工具是Mocha.js、Chai.js和ts-node。Mocha.js是一个测试运行器,Chai.js是一个断言库,帮助确定你是否从你的代码中得到你所期望的结果,而ts-node帮助我们在TypeScript项目中使用这些工具。按照下面的步骤,为你的npm包设置和运行测试。

  1. 在你的终端中使用下面的命令安装开发者的依赖项。
    npm i -D mocha @type/mocha chai @types/chai ts-node
  2. 在你项目的根目录下创建一个新文件.mocharc.json ,内容如下。
{
     "extension": ["ts"],
     "spec": "./**/*.spec.ts",
     "require": "ts-node/register"
}
  1. 在你项目的根目录下创建一个tests 文件夹。

  2. tests 文件夹中创建一个index.spec.ts 文件。

  3. index.spec.ts 文件中编写单元测试,以测试index.ts 中的代码。

  4. 在你的package.json 文件的scripts 部分添加一个test 属性,并给它一个值:mocha

  "scripts": {
    "clean": "rm -rf ./lib",
    "build": "npm run clean && npm run build:esm && npm run build:cjs",
    "build:esm": "tsc -p ./configs/tsconfig.esm.json && mv lib/esm/index.js lib/esm/index.mjs",
    "build:cjs": "tsc -p ./configs/tsconfig.cjs.json",
    "prepack": "npm run build",
    "test": "mocha"
  },
  1. 在你的终端中从项目的根文件夹中运行npm test ,以执行你的测试并查看结果。
bc@mbp-snyk modern-npm-package % npm test

> @clarkio/modern-npm-package@0.0.0-development test
> mocha

  NPM Package
    ✔️ should be an object
    ✔️ should have a helloworld property

  Hello World Function
    ✔️  should be a function
    ✔️ should return the hello world message

4 passing (22ms)

在一个管道中测试

现在你有测试来验证你的代码的行为,你可以在管道中使用它们。这将有助于确保引入你的版本库的任何变化都不会破坏你的代码行为。按照下面的步骤,创建一个测试工作流,作为项目管道的一部分。

  1. 为你的仓库创建一个新的GitHub Action。https://github.com/<your-account-or-organization>/<your-repo-name>/actions/new
  2. 将工作流重命名为tests.yml
  3. 在你的工作流文件中插入以下Snyk Action脚本。
name: Tests

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [12.x, 14.x, 16.x, 18.x]

    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm ci
      - run: npm test

这个YAML脚本检查出你的最新代码,安装其依赖性,并运行npm test 命令来执行你的测试。它对node-version 字段中列出的每一个Node.js版本都会这样做,这样你就可以确保代码在每个运行时都能按预期工作。

你现在已经完成了对你的项目的设置,以便对你的npm包的代码进行运行和评估测试。然而,你可能在想 "我如何在另一个项目中使用我的npm包进行测试?"让我们看看接下来你可以如何去完成这个任务。

包的测试

通过单元测试对你的npm包的代码有信心是一回事,但确保使用整个npm包的体验是另一回事。这涉及到将你的npm包作为一个依赖项拉入另一个项目,看看它在那里的使用是否像你期望的那样顺利。下面是你可以测试的五种方法。

  1. 通过npm pack 输出来安装
  2. 通过相对路径安装
  3. 通过以下方式安装npm link
  4. 通过注册表(如npmjs.com的npm公共注册表)安装
  5. 使用Verdaccio(一个开源的npm私有npm注册表项目)来运行端到端的软件包发布和安装步骤,作为你CI的一部分

npm打包

这种方法将利用npm pack 命令将你的npm包打包并压缩成一个文件(<package-name>.tgz)。然后你可以到你想使用该包的项目中去,通过这个文件来安装它。这样做的步骤如下。

  1. 在你的npm包目录下,在你的终端运行npm pack 。注意它产生的.tgz文件和它的位置。
  2. 改变目录到你想使用npm包的项目目录。例如cd /path/to/project
  3. 客户项目目录内,运行npm install /path/to/package.tgz ,但用步骤1中的.tgz文件位置的正确路径来替换它
  4. 然后你就可以开始在该客户项目中使用该包来测试东西了

这将使你在使用npm包时获得最接近生产的经验。

npm链接

这种方法将利用npm link 命令,在试图在客户项目中安装你的包时指向你的包目录。这样做的步骤如下。

  1. 在你的npm包目录中,在终端运行npm link
  2. 改变目录到你想使用npm包的项目目录。
    例子cd /path/to/project
  3. 客户项目目录中运行npm link <name-of-your-package>

这将使你的客户项目在代码中引用包时指向npm包的目录。这不会给你一个完整的类似生产的体验来使用你的包,但确实允许你确保功能按预期运行。

相对路径

这种方法利用了你现有的使用npm install 命令的知识。它类似于npm link ,而不需要知道像link 的新命令。

  1. 在你的客户项目目录中,在终端运行npm install /path/to/your/package

npm link 方法类似,这将允许你在客户项目中快速测试你的包的功能,但不会给你完整的类似生产的体验。这是因为它指向完整的软件包源代码目录,而不是你在npm注册表中找到的软件包的构建版本。

npm注册表

这种方法利用了npm包的公共(或你自己的)注册表。它涉及到发布你的包,并像你通常对任何其他npm包那样进行安装。

  1. 使用本文前面概述的步骤,通过npm publish 命令发布你的npm包
  2. 改变目录到你想使用npm包的项目目录。
    例如cd /path/to/project
  3. 客户项目目录中运行npm install <name-of-your-package>

在这一点上,你现在已经建立了你的包,以支持现代模块格式,并通过单元测试和包装测试确保它的行为符合预期。接下来,你需要确保没有任何安全问题,并防止在你的npm包中引入新的问题。

实施安全检查

就像你不希望在自己的项目中出现安全漏洞一样,你也不希望在其他人的项目中引入漏洞。构建一个预计会在许多其他项目中使用的npm包,为确保事情的安全性带来了更大的责任。你需要有安全检查,以帮助监测、提醒和提供帮助来减少漏洞。这就是像Snyk这样的工具可以简化完成这些需求所需的工作的地方。

对于这个例子中的npm包,你使用GitHub作为你的源代码控制管理工具,所以你将利用其GitHub Actions功能将Snyk整合到你的工作流程中。Snyk有一个GitHub Actions参考项目,可以帮助启动这方面的工作,并为你的项目可能使用的其他编程语言和工具提供例子。

  1. Snyk是免费的,所以注册并获得你的Snyk API Token
  2. 在GitHub上添加你的Snyk API Token作为仓库秘密:github.com///settings/secrets/actions/new
  3. 为你的仓库创建一个新的 GitHub 动作:https://github.com///actions/new
  4. 将工作流程重命名为snyk.yml
  5. 在你的工作流程文件中插入以下Snyk Action脚本。
name: Tests

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [12.x, 14.x, 16.x, 18.x]

    steps:
      - uses: actions/checkout@v3
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - run: npm ci
      - run: npm test
  1. 提交你的修改。
  2. 验证该动作是否成功运行:https://github.com/<你的账户或组织>/<你的repo-name>/actions

有了这个设置,任何时候任何人推送到你的版本库或针对它打开一个拉动请求,都会运行一个安全检查,以确保它不会在软件包中引入任何漏洞。如果发现了问题,Action将失败,并提醒你发现的安全问题的细节。接下来,你将围绕版本管理和发布你的npm包进行自动化处理。

关于目前的设置,需要注意的一点是,它只利用了Snyk开源(SCA)产品,而不是Snyk代码(SAST)。Snyk Code是我们的代码安全产品,你需要首先通过你的Snyk账户启用它(免费),然后在这里添加到你的工作流程脚本中,以充分利用它。要了解更多关于在管道中使用Snyk Code的信息,请阅读这篇关于用GitHub Actions构建安全管道的文章(它使用Java和Maven,但也可以用Node.js和npm代替)。

自动化版本管理和发布

每当你在主分支中合并改动时,你不希望每次都手动更新npm包的版本并发布它。相反,你会想让这个过程自动为你发生。如果你还记得本篇文章前面那个简单的npm包的例子,你用以下命令来更新npm包的版本,然后发布它。

npm version <major|minor|patch>
npm publish

你还想遵循语义版本管理的行业标准,以便你的包的消费者了解你发布到注册表的不同版本变化会带来什么影响。

什么是语义版本管理?

语义版本管理规定,版本要用三个占位符进行编号。第一个是主版本,第二个是次版本,最后一个是补丁版本。要了解有关语义版本管理、版本管理和锁定文件的更多信息,请阅读什么是包锁定JSON以及锁定文件如何与Yarn和NPM包一起工作

如果你可以跳过所有这些手动操作,而是用GitHub Actions建立一个自动化的工作流程,为你处理NPM包的发布,会怎么样?你很幸运,因为有一种叫做Semantic Release的工具可以与GitHub Actions整合。帮助实现这一过程自动化的关键是,你在向项目提交变更时使用所谓的常规提交。这使得自动化能够相应地更新一切,并知道如何为你准备项目的下一个版本。

下面的步骤将指导你为你的现代npm包进行这样的设置。

  1. 在你的终端,运行。npm i -D semantic-release
  2. 在你的终端中,运行。npx semantic-release-cli setup
  3. 按照终端的提示,提供所需的令牌。
    1. 你需要一个来自GitHub的个人访问令牌。要创建一个,请到github.com///settings/secrets/actions/new,但要用你各自的仓库细节来替换它。
    2. 在创建此令牌时,使用以下范围。

  1. 你还需要一个来自npm的自动化类型的访问令牌,只在CI环境中使用,这样它就能绕过你的账户的2FA工作。要创建一个,请到www.npmjs.com/settings//tokens。确保选择 "自动化 "类型,因为这将在CI/CD工作流程中使用。

bc@mbp-snyk modern-npm-package % npx semantic-release-cli setup
? What is your npm registry? https://registry.npmjs.org/
? What is vour nom username? clarkio
? What is your pm password? [hidden]
? What is your NPM two-factor authentication code? <2FA code>
Provide a GitHub Personal Access Token (create a token at https://github.com/settings/tokens/new?scopes=repo
<token>
? What CI are you using? Github Actions
bc@mbp-snyk modern-npm-package %
  1. 将你的npm令牌添加到你的GitHub仓库,作为仓库的秘密:https://github.com/<your-name-or-organization/<your-repository>/settings/secrets/actions/new 。将秘密的名称设置为NPM_TOKEN ,并加上你在前面步骤中检索到的值。

  1. 回到你的项目中,去你的package.json 文件,像下面这样添加一个releases 密钥。如果你的版本库的主分支仍然叫做master 而不是main ,那么相应地更新上面的branches 值。
"release": {
    "branches": ["main"]
  }
  1. 在你的package.json 文件中也添加一个publishConfig 键。
"publishConfig": {
    "access": "public"
 }
  1. 通过使用semantic-release npm 脚本来测试一切。使用下面的命令,设置NPM_TOKEN=GH_TOKEN= 的值,以使用你各自的标记值。然后在你的终端复制并运行完整的命令,看看一切是否正常运行。你会看到进程被记录在终端的输出中。如果出现任何问题,它们将在这里显示出来,并提供解决这些问题的细节。
  2. 确认试运行成功后,你可以用一个新的GitHub Action来设置你的GitHub仓库,为你处理发布过程。进入你在GitHub上的仓库,点击 "Actions"
  3. 点击 "新工作流程"选项。
  4. 将工作流程重命名为release.yml
  5. 在新的工作流文件中添加以下YAML脚本。这个脚本主要是说,一旦Snyk安全检查工作成功完成,就运行发布工作。发布工作会检查代码,设置Node.js环境,安装你的依赖关系,然后使用你的GitHub和npm令牌运行语义发布。
name: Release
on:
  workflow_run:
    workflows: ['Snyk Security Check', 'Tests']
    branches: [main]
    types:
      - completed

jobs:
  release:
    name: Release
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: 'lts/*'
      - name: Install dependencies
        run: npm ci
      - name: Release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: npx semantic-release
  1. 提交你的本地修改,并将其推送到你的GitHub仓库
    • 您可以通过在终端中运行git commit -am '<your commit message>' 命令,然后git push
    • 您还可以在VS Code中通过其版本控制功能来完成这项工作。
  2. 在所有这些设置完成后,你现在可以使用传统的提交方式将修改推送到你的主分支(或通过合并拉动请求),然后发布工作流程将运行(当然是在Snyk安全检查之后)。你可以在modern-npm-package版本库工作流程的例子中看到这种情况。

通过GitHub用Snyk进行持续安全监控

虽然在提交代码的过程中直接进行安全检查是很有好处的,但也有可能错过提交之间出现的漏洞。例如,如果你在几个月内没有向仓库推送任何代码,你就不会知道这段时间内发现的任何新漏洞。这时,Snyk的帮助就更大了!当你把你的GitHub仓库连接到Snyk时,它会自动监测新的漏洞,并提醒你注意,无论你在项目上编码的频率如何。除此之外,它还会提供自动拉动请求,为你解决安全问题。

Snyk有两个产品对确保你的npm包代码及其依赖关系的安全特别有帮助。Snyk Code协助你的软件包代码的安全,Snyk Open Source监控你的开源依赖的漏洞。

要开始充分利用你的免费Snyk账户,请按照以下步骤进行。

  1. 登录您的免费Snyk账户
  2. 选择添加项目,然后选择GitHub

  1. 按名称搜索你的项目的仓库,并选择旁边的复选框。

  1. 确认该仓库已成功导入Snyk。

开始创建现代npm包

让我们总结一下你在本文中学到的一切。首先,你已经熟悉了设置、创建和部署一个简单的npm包。这对于熟悉首次发布自己的npm包所需要的东西是很好的。然而,如果你想制作一个用于生产的npm包,这样做是相当费力的,也是不可持续的。

为了完成制作一个可用于生产的包,你随后学会了如何为CommonJS(CJS)和ECMAScript(ESM)模块格式进行构建,设置和编写单元测试,实现安全检查,并自动进行版本管理和发布。有了这些知识,你现在已经准备好制作更多属于你自己的npm包了,这些包很容易被社区或你的公司所使用。