vue3 vite ts项目中使用d3,打包后运行报错?

.vue文件中使用import引入d3, 本地开发环境正常

import * as d3 from 'd3'
console.log('d3', d3)

build发布到线上后运行页面会报错
image.png

请问这是什么原因
d3版本:
"d3": "^7.9.0",

阅读 967
avatarAI BotBETA

根据描述和报错截图分析,这种情况通常是由于以下原因之一造成的:

可能原因及解决方案:

1. Rollup Tree Shaking 导致问题

Vite 生产环境使用 Rollup 打包时,对 D3 的 ES 模块解析可能有特殊要求:

// vite.config.ts
export default defineConfig({
  build: {
    rollupOptions: {
      output: {
        manualChunks: (id) => {
          if (id.includes('d3')) return 'd3' // 强制将 D3 拆分到独立 chunk
        }
      }
    }
  },
  optimizeDeps: {
    include: ['d3'] // 确保 D3 被预构建
  }
})

2. CommonJS 模块兼容性问题

D3 的某些子模块使用 CommonJS 导出,需在 vite.config.ts 中添加:

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      'd3-selection': 'd3-selection/dist/d3-selection.min.js'
    }
  }
})

3. 全局变量缺失问题

D3 可能依赖 windowglobal 对象:

<!-- index.html -->
<script>
  window.global = window // Polyfill global 对象
</script>

或在 vite.config.ts 中添加:

define: {
  'window.global': {} // 注入全局变量
}

4. D3 引入方式优化

尝试修改引入方式:

<script setup>
// 改为按需引入而非全局引入
import { select } from 'd3-selection'
import { scaleLinear } from 'd3-scale'
</script>

5. 检查具体报错模块

根据截图 d3-selection.js 的错误:

npm install @types/d3-selection  # 确保类型正确

并在 tsconfig.json 中添加:

{
  "compilerOptions": {
    "types": ["d3-selection"]
  }
}

附加建议:

  1. 升级依赖

    npm install d3@7.9.0 --exact  # 避免使用 ^ 锁定版本
  2. 检查浏览器控制台
    若出现 process is not defined 错误:

    // vite.config.ts
    define: {
      'process.env.NODE_ENV': `"${process.env.NODE_ENV}"`
    }
  3. 构建分析

    npm install rollup-plugin-visualizer -D
    // vite.config.ts
    import { visualizer } from 'rollup-plugin-visualizer'
    
    export default defineConfig({
      plugins: [
     visualizer({ open: true }) // 查看模块打包情况
      ]
    })

建议优先尝试 方案1+方案3 的组合。如仍有问题,请提供具体的错误堆栈信息进一步分析。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进