如何将Tabulator作为ES模块导入?package.json缺type:module报错如何处理
问题解答
关于是否添加"type": "module"的说明
- 如果你是修改node_modules/tabulator-tables/package.json添加该配置,临时生效是可行的,但该方案不可持久,重装依赖后会被覆盖,不推荐在生产项目中使用。
- 如果你是修改自己项目根目录的package.json添加该配置,无法解决问题:
"type": "module"仅对当前包内的.js文件生效,不会影响node_modules下的第三方依赖解析逻辑。
稳定的解决方案
下面列几个比当前动态导入更适合常规开发的方案:
- 配置Vite预构建规则
在vite.config.js/vite.config.ts中添加如下配置,Vite的依赖预构建会自动将Tabulator的CommonJS产物转译为符合要求的ESM格式,后续可以直接使用静态导入:
import { defineConfig } from 'vite' import { svelte } from '@sveltejs/vite-plugin-svelte' export default defineConfig({ plugins: [svelte()], optimizeDeps: { include: ['tabulator-tables'] } })
配置完成后直接正常导入即可:import Tabulator from 'tabulator-tables'
直接导入官方ESM产物
Tabulator官方已经打包了单独的ESM版本,可以直接指定路径导入,无需额外配置:import Tabulator from 'tabulator-tables/dist/js/tabulator_esm.js'现有动态导入方案优化
如果你要继续使用当前的await import('tabulator-tables')动态导入方案,建议将导入逻辑放在Svelte的onMount生命周期中,避免SvelteKit等服务端渲染场景下的环境兼容问题。
补充说明
Tabulator官方未在根package.json添加"type": "module"是为了兼容老项目的CommonJS导入逻辑,如果全局添加该配置,所有使用require('tabulator-tables')的旧项目都会报错,因此官方采用了多产物打包的方案提供ESM支持,目前的导入问题是由于包的导出声明配置不够完善导致的。
内容的提问来源于stack exchange,提问作者Jaydeep
相关产品推荐
相关产品推荐

