You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Vite中如何实现类似require的同步JSON导入?

在Vite中实现类似require的JSON同步导入效果

Vite基于ES模块规范,原生ES模块没有同步动态导入的API,但可以通过以下几种方案实现接近require的同步效果:

1. 静态导入(路径固定时优先用)

如果JSON文件的路径是固定的,直接用ES静态导入即可,完全同步:

import lang from './zh-CN.json'
// 直接使用lang的索引,比如lang.title

这种方式最简单,Vite会在构建阶段就把JSON文件打包进代码,运行时直接可用。

2. 预导入+映射表(动态路径但范围有限)

如果路径是动态的,但可选范围明确(比如多语言文件只有几种),可以先预导入所有可能的JSON,再用对象映射实现同步获取:

// 预导入所有可能的语言文件
import zhCN from './zh-CN.json'
import enUS from './en-US.json'
import jaJP from './ja-JP.json'

// 建立路径到模块的映射
const langMap = {
  'zh-CN': zhCN,
  'en-US': enUS,
  'ja-JP': jaJP
}

// 动态路径获取,同步直接用
const path = 'zh-CN' // 这里的path可以是动态变量
const lang = langMap[path]
console.log(lang.welcome) // 直接访问索引

这种方案完全同步,没有异步开销,适合可选值不多的场景。

3. 使用Vite的import.meta.glob(动态路径且范围广)

Vite提供了import.meta.glob API支持批量匹配文件,通过eager: true选项可以实现同步加载,最接近require的动态同步效果:

// 同步加载所有符合匹配规则的JSON文件
// 注意:匹配路径是相对于当前文件的相对路径
const langModules = import.meta.glob('./lang/*.json', { eager: true })

// 根据动态路径获取对应的JSON模块
const path = 'zh-CN'
const lang = langModules[`./lang/${path}.json`].default
// 直接使用lang的索引,比如lang.login
  • 匹配规则支持通配符,比如./**/*.json匹配所有子目录下的JSON文件
  • eager: true会让Vite在构建时就把所有匹配到的文件打包,运行时直接同步获取模块

4. 异步封装(完全动态路径的妥协方案)

如果路径完全动态且无法提前预加载,只能接受异步,但可以封装成函数简化使用:

async function loadLang(path) {
  try {
    const module = await import(`./${path}.json`)
    return module.default
  } catch (err) {
    console.error('加载JSON文件失败:', err)
    return {}
  }
}

// 使用时在异步环境中调用
async function init() {
  const lang = await loadLang('zh-CN')
  console.log(lang.home) // 访问索引
}
init()

这种方案需要在异步函数中使用await,适合无法提前确定路径的场景,比如用户自定义的文件路径。


内容的提问来源于stack exchange,提问作者dy-xiaodong2022

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:10:49