适用场景
当开发一个组件包时,由于平台的差异,所以在某些实现上需要实现两套。
例如,multi-input
是一个可以同时用于微信小程序和浏览器环境的npm
库,其中的request
请求库在不同客户端的实现不一样。在微信环境下用的是wx.request
,在浏览器环境用的是fetch
。
但是在微信环境使用时,我不希望我引入的代码中包含用不到的适用于浏览器环境的fetch
等相关代码。再加上微信小程序对于代码体积的严格限制。所以我希望multi-input
再引入的时候可以有多个入口,主逻辑代码直接引入multi-input
,request
库相关逻辑单独有个入口。
解决办法有两种
- 将
request
库相关逻辑抽离成另外一个npm
包 rollup
打包多入口文件并配合package.json
中的exports
字段实现
本文介绍第二种方法,使用示例如下:
这样在微信小程序端使用并打包时,就不会将WebRequest
相关代码打包到微信小程序代码中,实现按需引入。
代码结构
| 代码源码:multi-input
multi-input
库代码结构如下
注意事项
要想要外部以这样的方式引用,有几个必要条件:
- 代码隔离:
adapter
下的文件只能引用adapter
目录中的文件,src
下中的文件只能引用src
中的文件 - 打包产物路径存在:
multi-input
根目录下必须存在打包后的lib/web-request
文件 - 路径映射:
package.json
中的exports
字段中需要有lib/web-request
的路径映射 - 多入口打包:
rollup
需要分别打包src
和adapter
下的文件
Rollup配置
功能点如下
- 将
multi-input
以esm
模式导出到dist
下 adapter
下的请求库以esm
模式导出到lib
下- 打包后的类型声明文件和
js
文件和原文件目录结构保持一致