Vue组件库发布为NPM包的技术疑问及配置咨询
Gist 我的vite和tsconfig配置地址为这里。
免责声明:我对包和模块的运作方式非常陌生,之前仅接触过
import/export语法,因此下文可能多次使用“tree-shaking”一词。
我希望将旧项目中可复用的Vue组件迁移至一个可通过npm使用的私有共享包中,仅用于Vite项目,不考虑CDN引入方式。以下是我设计的包目录结构:
my_components | package.json │ vite.config.ts │ tsconfig.json | tsconfig.vite.json │ └───src │ │ index.ts │ │ │ └───components │ | index.ts │ | MyButton.vue │ | MyDropdown.vue | | ... | | │ └───assets | | | └───sass | | | | style.scss | | ... │ └───dist │ my-lib.es.js │ style.css └───types | index.d.ts | src/MyButton.vue.d.ts | src/MyDropdown.vue.d.ts
我使用Vite的库模式构建,生成ES模块及打包文件。构建后CSS约1MB、JavaScript约300KB(未压缩),原因是包含大量可能不会被消费项目使用的独立组件,且这些组件带有各自的依赖(如fullcalendar、prismjs、tiny mce等)。理想状态是共享包可包含大量依赖,但消费项目仅打包实际使用的内容。
我对整个流程存在一些疑问和知识盲区:
这是一项重要需求,否则无法为不同项目定制组件样式。我似乎只能在package.json中导出src/assets/sass/style.scss,让消费者引入该文件而非打包后的dist/style.css自行构建,就像Bootstrap的npm包那样。
B.1) 我全程使用import/export语法,最终生成的dist/my-lib.es.js是单个大模块,还是会在单个文件中保留多个模块定义?
我的项目依赖bootstrap、prismjs、quill、fullcalendar等,均已放入devDependencies。
B.2) 这些依赖的完整源码会被包含在我的包中吗?还是Vite在构建dist时会对其进行tree-shaking?
B.3) 在消费项目中导入该打包后的JS文件时,它是否支持tree-shaking?如果不支持,该如何配置才能实现?我希望最终项目仅打包共享包中实际使用的内容。
由于该包仅用于Vite项目,能否不生成dist目录直接发布?仅发布src目录,由消费项目自行引入、导入并构建所需内容,这样应该能最大程度减少最终项目的打包体积,对吗?
C.1) 如果可行(我尚未找到相关资料),如何在消费项目中配置Typescript、ESLint和Vite以正确处理原始代码?
附:我希望将其作为包而非Git仓库,因为之后可能委托他人开发共享包,npm包比Git子仓库更易使用。欢迎指出我的想法可能存在的问题,但请不要将此作为主要解决方案。
我若能分析共享包构建及消费项目应用构建中包含的内容,就能更好地理解上述概念,但目前缺乏相关经验,不知有哪些工具或工作流可用,求推荐?
内容的提问来源于stack exchange,提问作者h-sigma

