考察点分析

本题主要考察以下核心能力:

  1. Tree Shaking机制理解:能否准确阐述ES模块静态分析原理及其与打包工具的配合机制
  2. 组件库架构设计:是否掌握模块化导出方案,包括多入口、分包策略等工程化实践
  3. 构建工具配置能力:对Vite/Rollup配置项的掌握程度,特别是preserveModules等高级优化配置

具体技术评估点:

  • ES模块导出规范与CommonJS差异
  • Rollup的preserveModules模式工作原理
  • 副作用标注与package.json配置
  • 组件目录结构与构建输出的映射关系

技术解析

关键知识点

  1. ES Module静态结构 > Rollup模块保留 > 副作用标注
  2. 组件独立分包 > 构建输出优化

原理剖析

Tree Shaking依赖于ESM的静态语法特征,打包工具通过模块依赖图谱分析未被引用的导出。当组件库采用export const Component形式导出时,Rollup能精准识别未使用代码。配合preserveModules: true配置,会保留原始模块结构而非打包成单一chunk,保障按需引入的可行性。

常见误区

  • 误用export default导致导出分析失效
  • 未配置sideEffects: false阻碍优化
  • 组件耦合导致的隐性依赖(如全局样式)

问题解答

实现Tree Shaking需遵循以下步骤:

  1. 模块规范:组件使用具名导出

      // src/components/Button/index.ts
    export const Button = defineComponent({...})
      
  2. 入口聚合:主文件二次导出

      // src/index.ts
    export * from './components/Button'
    export * from './components/Input'
      
  3. Vite配置

      // vite.config.js
    export default defineConfig({
      build: {
        lib: {
          entry: 'src/index.ts',
          formats: ['es']
        },
        rollupOptions: {
          external: ['vue'],
          output: {
            preserveModules: true, // 保留模块结构
            dir: 'dist', // 分包输出目录
            entryFileNames: '[name].js' // 按源文件名生成
          }
        }
      }
    })
      
  4. package.json声明

      {
      "sideEffects": false,
      "module": "dist/index.js"
    }
      

解决方案

编码示例

  // 组件结构示例
src/
  components/
    Button/
      index.ts  # 组件实现
      style.css # 组件样式
    Input/
      index.ts

// 样式处理需配合构建插件(如vite-plugin-css-injected-by-js)
  

优化建议

  • 分包粒度:按业务域划分高阶组件
  • 缓存优化:哈希文件名配合持久化缓存
  • 低端设备适配:动态polyfill注入

深度追问

  1. 如何验证Tree Shaking生效?

    打包产物分析工具(如rollup-plugin-visualizer)

  2. 样式文件如何按需加载?

    CSS模块化+构建分离(如unplugin-vue-components自动导入)

  3. ESM与CommonJS混用风险?

    破坏静态分析导致Tree Shaking失效

Last updated 06 Mar 2025, 13:07 +0800 . history