npm包的设计
· 2 min read
设计一个 npm 包经常要考虑要不要分包,比如早期将项目中的各个包分开:reports、interface、log、request 等,各司其职。后来由于业务互相耦合的很厉害,所以又将这些包合并成一个包,现在就将 reports、interface、request 合并成为了一个 interface 包。
在整理 laya 库的时候发现早期一直想分离一个@pawgame 的库,给纯粹的 es6 来用,不捆绑任何框架,不管是 Laya 还是 Cocos 还是 Egret 还是 React 都可以用。后来发现不太现实,因为为 了兼容他们反而写了一堆冗余代码,而如果都整合在一起又导致各个项目不通用。
所以我想要不要把@pawgame 的包拆分足够细致,如果没有必要不再更新,而对于单独的项目来说写一个对应的 core 包。 大概结构如下:
laya工程
@pawgame/laya-core
├── @pawgame/ts-mvc
├── @pawgame/ts-request
├── @pawgame/ts-utils
其中 laya-core 是针对 laya 的核心库,依赖并 laya 本身的类库进行扩展。ts-mvc 纯 ts 代码的 mvc 模式代码,在 laya-core 中会直接饮用 ts-mvc 代码。ts-request 是 ts 的网络请求库,ts-utils 是 Object 的工具库。
package.json 设置
- 要指定 files 目录,否则会将项目整体作为包体。
- 指定 type="module",让使用方来决定是否 babel 转译。
- 指定 main 文件和 types 对应的 d.ts 文件。
参考:
package.json
{
"name": "@pawgame/laya-game-sdk",
"version": "0.0.4",
"description": "",
"type": "module",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"files": ["lib/"],
"scripts": {
"build": "rm -rf lib && tsc",
"test": "echo \"no test specified\"",
"lint": "eslint src/ --ext .js,.jsx,.ts,.tsx"
},
"repository": {
"type": "git",
"url": "git+https://github.com/daichangxin/js.laya-game-sdk.git"
},
"author": "daichangxin",
"license": "MIT",
"bugs": {
"url": "https://github.com/daichangxin/js.laya-game-sdk/issues"
},
"homepage": "https://github.com/daichangxin/js.laya-game-sdk#readme",
"devDependencies": {
"@shm-open/eslint-config-bundle": "^1.7.5",
"typescript": "^4.5.4"
},
"dependencies": {
"@pawgame/game-library": "^2.1.0"
}
}
类库的 tsconfig 参考:
tsconfig.json
{
"compilerOptions": {
"moduleResolution": "node",
"target": "es6",
"declaration": true,
"outDir": "lib",
"skipLibCheck": true,
"removeComments": false,
"lib": ["ESNext", "DOM"]
},
"include": ["src", "libs"]
}