用TDD的方式写一个package(下)

305 阅读2分钟

上文我们已经完整的写了一个add函数和测试用例 还记得我们的目标吗 接着继续吧。。。

  1. 发布到npm仓库,可通过pnpm install xxxx下载到本地使用
  2. 每个文件必须包含测试文件,保证代码质量
  3. 可通过import以及script标签来引用

通过import以及script标签来引用

修改package.json

{
  "name": "@junxuan/js-tools",
  "version": "1.0.0",
  "description": "js-utils",
  "type": "module",
  "main": "./dist/js-tools.js",
  "module": "./dist/js-tools.js",
  "exports": {
    ".": {
      "import": "./dist/js-tools.js",
      "require": "./dist/js-tools.umd.cjs"
    }
  },
  "author": {
    "name": "junxuan"
  },
  "scripts": {
    "test": "vitest",
    "build": "vite build",
    "doc": "typedoc"
  },
  "files": [
    "dist",
    "LICENSE",
    "README.md",
    "package.json"
  ],
  "keywords": [
    "composition",
    "api",
    "typescript",
    "ts",
    "type"
  ],
  "license": "MIT",
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^5.57.0",
    "@typescript-eslint/parser": "^5.57.0",
    "eslint": "^8.37.0",
    "eslint-config-standard-with-typescript": "^34.0.1",
    "eslint-plugin-import": "^2.25.2",
    "eslint-plugin-n": "^15.0.0",
    "eslint-plugin-promise": "^6.0.0",
    "typedoc": "^0.23.28",
    "typescript": "^5.0.3",
    "vite-plugin-dts": "^2.2.0",
    "vitest": "^0.29.8"
  },
  "dependencies": {
    "vite": "^4.2.1"
  },
  "publishConfig": {
    "registry": "https://registry.npmjs.org/"
  }
}

比较核心的几个字段:

  1. type: 'module' 用于定义package.json文件和该文件所在目录根目录中 .js文件和无扩展名文件的模块化处理规范,默认值为'commonjs'。就是你希望nodejs通过什么模块化来处理你的包 可选值是 'commonjs' | 'module' 这里我们显示的声明 'module',也就是ESM
  2. main:'./dist/js-tools.js' 包的入口文件。就是别人引入你的包时候 首先会去找的那个文件
  3. "module": "./dist/js-tools.js", 对应的esm module引入方式的入口文件
  4. exports 这个可以配置不同环境对应的模块入口文件,并且当它存在时,它的优先级最高。

比如使用 require 和 import 字段根据模块规范分别定义入口:

  "exports": {
    ".": {
      "import": "./dist/js-tools.js",
      "require": "./dist/js-tools.umd.cjs"
    }
}

为啥要加一个 "." 呢 ,因为nodejs除了支持默认包的导出外,还支持子路径导出,例如:

"exports": {
  "./style": "./dist/css/index.css'
},

这样在引入 index.css 时候 就可以用import 'packageName/style'

调试

本地pnpm link 调试 大家应该都很熟悉吧

  1. 将本地包link到全局node_modules pnpm link --global

  1. 在其他项目中执行pnpm link --global {packageName}

我们新建一个简单的项目测试一下

index.mjs

import {addNumber} from '@junxuan/js-tools' // esm引入方式

console.log(addNumber(3, 4))

index.cjs

const {addNumber} = require('@junxuan/js-tools')

console.log(addNumber(9,6))

可以看出,当使用commonjs规范引入时,的确是进入了js-tools.umd.cjs 验证了配置入口是正确的

因为我们也同时打包了umd规范的输出文件,所以直接在script 标签引入也可以直接使用

npm 发布

这里就很简单了

  1. pnpm login --registry https://registry.npmjs.com
  2. pnpm publish

可能会让你输入一些验证之类的

至此,我们的目标基本已经完成了

总结

通过这个案例,完成了一个简单的包含测试用例的npm package的开发、调试、发布的流程。看似很简单,其实在写这篇文章的过程中,需要去做很多的验证。以前没注意到的细节,也会一一实践。果然【输出才是最好的学习方式】如果这篇文章能帮到你 希望能点个赞ღ( ´・ᴗ・` )

上一篇:用TDD的方式写一个package(上)