背景
我们做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
网友评论