打包
package.json入口
现在的npm包,需要暴露main/module/exports/typing等多个字段, 可以参考axios-retry的package.json
"typings": "./index.d.ts",
"main": "index.js",
"module": "lib/esm/index.js",
"exports": {
".": {
"import": "./lib/esm/index.js",
"require": "./index.js"
},
"./package.json": "./package.json"
}
暴露多个命令
在package.json中指明多个
"bin": {
"egg-bin": "bin/egg-bin.js", "mocha": "bin/mocha.js", "ets": "bin/ets.js"
},
其中mocha和est是对其他库的包装而已:
est.js
#!/usr/bin/env node
'use strict';
// 注册ets命令,使用egg-ts-helper的bin
require('egg-ts-helper/dist/bin');
mocha.js
#!/usr/bin/env node
'use strict';
// 注册mocha命令,使用mocha
require('mocha/bin/mocha');
依赖同一个库的不同版本
有时候,我们的逻辑中需要进行适配器,对不同的情况使用同一个库的不同版本,可以参考@vue/cli-service:
通过不同名称和不同版本来依赖同一个库:
{
"@vue/vue-loader-v15": "npm:vue-loader@^15.9.7",
"vue-loader": "^17.0.0",
}
条件性依赖不同的包
在JavaScript中实现条件性下载不同的包是很难的,但是条件性依赖不同的包确是可以。
诀窍在于npm的postinstall阶段,去做一些手脚,可以参考vue-demi。它在vue2.6之前、vue2.7和vue3后分别使用不同的包和方案来完成逻辑。
注册postinstall:
"scripts": {
"postinstall": "node ./scripts/postinstall.js",
"release": "npx bumpp --tag --commit --push && npm publish"
},
在脚本中根据不同的版本,把不同的文件拷贝到某个公共通用的文件夹,然后自己的逻辑永远使用公共通用的文件夹。分别需要依赖的包做在peerDependencies里让用户自行按需依赖即可。