编写自己的node_modules包

2024-01-29  本文已影响0人  wn777

背景

我们做nodejs代码开发过程中,随着代码的不断增多,当不同项目或服务需要引入相同的代码 。如何跨服务,甚至跨项目使用相同代码?
其中一个方法就是,编写共用的node_modules包,然后在需要的地方作为package.json中的依赖引入。
在开始之前,简单梳理下我们要做的事情:开发一个”公共依赖包”(下文中我们命名这个包叫:shared_code), 然后 在业务代码里引入这个”公共依赖包”。

准备环境

npx: 8.9.0
node: 18.2.0
yarn: 1.22.19

开始编写

我们的node_module包,语言选用ts,写完再编译成js(依赖typescript)

目录结构

common :share_code中存放一些model表信息。依赖(@typegoose/typegoose)
app1 && app2 : 分别依赖使用了share_code中的model表信息。

├── app1
│   ├── index.ts
│   ├── package.json
│   └── tsconfig.json
├── app2
│   ├── index.ts
│   ├── package.json
│   └── tsconfig.json
├── common
│   ├── index.ts
│   ├── package.json
│   ├── src
│   │   └── model
│   │       ├── index.ts
│   │       ├── Team.ts
│   │       └── User.ts
│   └── tsconfig.json
└── README.md

代码内容

common中,这里定义一些公共表结构,然后在index.ts中导出。


公共表结构 对外部导出
对外部导出 app1 & app2 中,对于表结构进行引入

配置文件

编写package.json,这里我们公共的包中,入口分别指向js入口 和 编译后type的入口。

{
  "name": "shared_code",
  "version": "1.0.0",
  "main": "index.js",
  "types": "./build/index.d.ts",
  "license": "MIT",
  "dependencies": {
    "@typegoose/typegoose": "^12.1.0",
    "typescript": "5.2.2"
  }
}

编写tsconfig.json,这里直接给例子,对应字段含义写在注释里。
可以先注意outDir, include, exclude 字段。

{
    "compilerOptions": {
        "baseUrl": "./", // 基础目录
        "outDir": "./build", // 编译输出目录
        "declaration": true, // TypeScript 会在编译时生成对应的声明文件
        "skipLibCheck": true, // TypeScript 编译器将跳过对引入的声明文件(例如从 node_modules 中导入的库)的类型检查。
        "experimentalDecorators": true, // 允许使用实验性的装饰器语法。
        "lib": ["es2015", "es2016"], // 使用指定标准库进行编译
        "target": "es2017", // 生成 ES(ECMAScript) - 2017版本的代码
        "module": "commonjs", // 指定生成的 JavaScript 代码的模块系统类型
        "composite": true, // 增量编译
        "sourceMap": true, // 用于debug打断点时, 进行代码关联
    },
    "exclude": ["node_modules/**/*", "**/*.d.ts"], // 不编译哪些
    "include": ["./index.ts", "src/**/*"]  // 哪些要编译
}

发包与引入

发布包

安装依赖,编译,

cd common && yarn install && npx tsc 

这里我们先使用yarn link的形式, 发布并本地关联。(refs:https://classic.yarnpkg.com/lang/en/docs/cli/link/)
(下一章 单独讲下如何发包到仓库 并引入,参考:https://www.jianshu.com/p/5bf288a2d461

cd common && yarn link

引入包

// 以app1举例
cd app1/ // 进入app1目录下
yarn link shared_code // 链接发布的包
npx tsc // 编译

至此便完成一个包的发布以及代码中的引入。

完整代码示例

https://github.com/Wunan777/my_node_module/tree/main/local_package_demo

上一篇 下一篇

猜你喜欢

热点阅读