ESModule静态导入路径必须是字面量字符串,禁止变量或表达式拼接;可用显式列举、动态import()配合类型守卫、构建时生成静态入口等方式替代。

ESModule 的导入路径必须是静态字符串,不能使用变量或表达式拼接,这是规范强制要求,也是静态分析(如 TypeScript、ESLint、打包工具)能正确解析依赖的前提。动态拼接路径会导致编译报错或运行时失败,比如 import(`./modules/${name}.js`) 是合法的动态 import(),但不是静态 import 声明。
用静态 import 显式列出所有可能模块
如果模块集合有限且可预知(如固定的一组语言包、主题、插件),直接逐个 import 并用对象或 Map 管理:
import zh from './locales/zh.js';
import en from './locales/en.js';
import ja from './locales/ja.js';
const locales = { zh, en, ja };
// 使用时
const locale = locales[lang] ?? locales.en;
这种方式完全静态,类型安全,Tree-shaking 友好,IDE 和 TypeScript 都能准确推导类型和跳转定义。
用动态 import() + 类型守卫做运行时加载
当路径确实需动态决定(如用户上传的模块名、插件 ID),改用 import() 函数调用,并配合类型校验防止任意字符串:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 预先定义允许的模块名集合(
type ValidModule = 'chart' | 'table' | 'form') - 用类型断言或运行时校验确保参数在白名单内
- 捕获加载失败,避免静默错误
type ValidModule = 'chart' | 'table' | 'form';
async function loadModule(name: string): Promise<any> {
if (!['chart', 'table', 'form'].includes(name)) {
throw new Error(`Invalid module: ${name}`);
}
return import(`./modules/${name}.js`);
}
借助构建时预处理生成静态入口
若模块列表来自配置文件(如 plugins.json),可在构建前用脚本自动生成一个静态入口模块:
- 读取配置,生成类似
auto-imports.ts文件,含全部 import 语句和导出映射 - 代码中只 import 这个生成的入口,路径仍是静态的
- Vite / Webpack 插件(如
vite-plugin-dynamic-import)可自动化该流程
避免常见误写
以下写法均违反静态约束,应禁止:
-
import './' + path + '.js';→ 语法错误 -
import mod from `./${env}.js`;→ 模板字符串仍属动态 -
const m = await import('./' + name);→ 这是合法的动态 import,但不属于 ESModule 静态导入声明
记住:静态 import 是声明,不是执行;它的路径必须在源码中字面可见、不可变。

















