rollup更适合web components的npm发布,因其轻量、tree-shaking效果好、产出esm/umd/类型声明更干净;需配置external排除lit等依赖、librarytarget指定模块格式,并在package.json中正确设置main/module/types/exports字段。

Web Components 本身是浏览器原生支持的技术,不依赖框架,但要发布为可复用的 npm 包,仍需借助打包工具处理模块化、兼容性、产物格式等关键问题。核心目标是:输出标准 ES Module(供现代项目直接 import),同时兼容 UMD(供 script 标签引入)和类型声明(TypeScript 支持)。
选对打包工具:Rollup 或 Webpack 都可行,推荐 Rollup
Rollup 更轻量、更适合库类项目,Tree-shaking 效果好,产出干净;Webpack 功能全但配置略重,适合带大量资源(SVG、CSS、图片)的复杂组件包。
- Rollup + @rollup/plugin-node-resolve + @rollup/plugin-commonjs:处理第三方依赖与 CommonJS 模块
- Rollup-plugin-lit-css(如使用 Lit)或 rollup-plugin-postcss(如含 CSS):编译样式并注入 Shadow DOM
- Rollup-plugin-typescript2 或 @rollup/plugin-typescript:生成 .d.ts 类型文件
- 若用原生 Custom Elements,无需 Vue/React 插件,避免冗余依赖
规范项目结构:src 入口 + types + 构建输出
清晰的目录利于维护和按需导入:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
-
src/components/:存放每个自定义元素的 TS/JS 文件(如
my-button.ts) -
src/index.ts:统一导出所有组件,支持命名导入(
import { MyButton } from 'my-ui') - types/(可选):手动补充复杂 API 的类型定义
-
dist/:构建后产物,包含
index.js(ESM)、index.umd.js(UMD)、index.d.ts
关键配置:libraryTarget 与 externals 必须设对
在打包配置中,这两项决定包能否被正确消费:
-
output.libraryTarget: 'es' → 输出 ESM,支持
import和 tree-shaking -
output.libraryTarget: 'umd' → 同时支持
require、import和全局变量(如window.MyButton) - external: ['lit'](若用 Lit)或 external: [](纯原生)→ 防止把 Lit 打进包里,由使用者自行安装,减小体积
- output.globals: { lit: 'lit' } → UMD 模式下,告诉打包器外部依赖对应全局变量名
package.json 发布必备字段
npm 安装时靠这些字段定位入口和类型:
-
main:指向 UMD 版本(
"main": "dist/index.umd.js") -
module:指向 ESM 版本(
"module": "dist/index.js") -
types 或 typings:指向类型入口(
"types": "dist/index.d.ts") -
exports(推荐):更精细控制不同环境的入口,例如:
"exports": { ".": { "import": "./dist/index.js", "require": "./dist/index.umd.js", "types": "./dist/index.d.ts" } } -
files:明确白名单(如
["dist", "types", "README.md"]),避免发布 src 或 node_modules










