javascript中不能用星号模糊匹配导入,但es模块支持import * as ns语法导入所有具名导出到命名空间对象,不包含默认导出(需通过.default访问),仅适用于esm环境。

在 JavaScript 中,不能直接用星号(*)作为通配符像 shell 或正则那样“模糊匹配”导入任意名称的成员。但 ES 模块(ESM)提供了 import * as ns 语法,用于将模块的所有**具名导出(named exports)** 汇总到一个命名空间对象中 —— 这是最接近“通配符导入整个模块所有成员”的标准方式。
✅ 正确用法:import * as namespace
该语法会把目标模块所有具名导出绑定为一个只读的普通对象的属性,不包含默认导出(default),也不包含动态/条件导出或未显式导出的内容。
- 假设
mathUtils.js内容如下:
export const PI = 3.14;
export function add(a, b) { return a + b; }
export function mul(a, b) { return a * b; }
export default function greet() { return 'Hello'; }
- 在另一个文件中这样导入:
import * as math from './mathUtils.js'; <p>console.log(math.PI); // 3.14 console.log(math.add(2,3)); // 5 console.log(math.mul); // [Function: mul] console.log(math.default); // [Function: greet] ← 默认导出被挂到 .default 属性上</p>
⚠️ 注意事项和常见误区
-
不是“通配符匹配字符串名”:它不支持类似
import * as utils from './utils.js' where name.startsWith('format')这种运行时过滤,纯静态分析结果。 -
不自动解构,需通过属性访问:你不能直接写
add(1,2),必须写math.add(1,2);若想解构,需额外写const { add, PI } = math; -
默认导出需显式访问
.default:除非你单独用import greet from './mathUtils.js',否则默认导出不会“混入”命名空间对象的顶层属性。 -
仅适用于 ESM,不适用于 CommonJS:Node.js 的
require()或 CJS 环境不支持该语法;TypeScript 编译成 CJS 时也会报错或降级为其他行为。
? 替代方案:按需导入更推荐
虽然 import * as ns 语法合法,但实际工程中更推荐明确列出所需成员,利于 tree-shaking 和可读性:
import { add, PI } from './mathUtils.js'; // 只引入需要的,体积小、意图清晰
- 如果确实需要全部具名成员且后续要动态访问(如插件系统、反射场景),再用
import * as ns。 - 搭配 TypeScript 时,命名空间对象类型是精确推导的,编辑器能提供完整补全。
❌ 不支持的“伪通配符”写法(错误示例)
-
import * from './utils.js'→ ❌ 语法错误,缺少as绑定名 -
import * as obj from './utils.js' with { assert: { type: 'json' } }→ ❌import *不支持with断言(目前仅import()动态导入支持) -
import { * } from './utils.js'→ ❌ 不存在这种语法,ES 规范未定义











