贝利信息

javascript模块是什么_如何导入和导出模块?

日期:2026-01-08 00:00 / 作者:狼影
JavaScript模块需显式用export/import声明且环境支持:浏览器须type="module",Node.js须"type":"module"或.mjs;默认为脚本非模块,无自动识别;路径须带扩展名或相对/绝对前缀;export在顶层,default后不可跟函数声明;import()可动态加载但不tree-shaking。

JavaScript 模块是封装代码、隔离作用域、按需加载的基本单位,不是靠 varfunction 声明就能自动变成模块的——必须显式使用 exportimport,且运行环境要支持模块系统(比如浏览器启用了 type="module",或 Node.js 启用了 "type": "module")。

模块必须用 import / export 显式声明,不能靠文件名或位置自动识别

JS 文件默认是脚本(script),不是模块(module)。即使你把逻辑拆成多个 .js 文件,不加 export 就没有导出,不写 import 就无法导入,全局污染照旧,作用域也不隔离。

常见错误现象:

正确做法:

export 的三种写法和对应 import 方式

导出不是“让别人能访问变量”,而是“声明哪些绑定可以被其他模块引用”。绑定一旦导出,就与原始变量保持活连接(不是拷贝值)。

示例(math.js):

export const PI = 3.14159;
export function add(a, b) {
  return a + b;
}
export default function multiply(a, b) {
  return a * b;
}

对应导入方式:

⚠️ 容易踩的坑:

动态 import() 是函数调用,不是声明,适用于条件加载

静态 import 必须在顶层、编译时确定路径;而 import() 是一个返回 Promise 的函数,可以在任意位置调用,适合按需加载、路由懒加载、错误降级等场景。

典型用法:

async function loadChart() {
  const { Chart } = await import('./chart.js');
  new Chart(document.getElementById('chart'));
}

注意事项:

模块解析路径必须带扩展名或以 /./../ 开头

ESM 规范禁止省略扩展名(不像 CommonJS 自动尝试 .js.json)。浏览器和现代 Node.js 都严格遵循这点。

错误写法:import { foo } from 'utils'; → 报错 Failed to resolve module specifier "utils"

正确写法(任选其一):

⚠️ 特别注意:

模块不是语法糖,它是运行时行为。写对 exportimport 只是第一步,路径是否合法、环境是否启用模块模式、是否混用 CJS/ESM,任何一个环节断掉都会静默失败或报难以定位的错误。