javascript模块是什么_如何使用import和export?

发布时间 - 2026-01-10 00:00:00    点击率:
JavaScript模块是语言级机制,需显式声明type="module"或满足Node.js条件;export/import非语法糖,有命名/默认导出之分;路径须带扩展名或为绝对/相对URL;动态import()返回Promise;循环依赖时未执行完的导出为undefined。

JavaScript 模块就是把代码按功能拆成独立、可复用的文件,每个文件默认拥有自己的作用域,importexport 是声明依赖与暴露接口的唯一标准方式——不是语法糖,是语言级机制,不加 type="module" 或没配对的 export/import 会直接报错。

模块文件必须显式声明为 module 才生效

浏览器中, 标签默认是传统脚本,import/export 会报 Uncaught SyntaxError: Cannot use import statement outside a module。必须写成:

Node.js 中则需满足任一条件:.mjs 后缀、package.json 中设置 "type": "module",或用 node --input-type=module 运行字符串。混用 require()import 会导致 ERR_REQUIRE_ESM 错误。

export 有命名导出和默认导出两种形式

命名导出适合暴露多个值(函数、类、常量),导入时名称必须一致;默认导出只能有一个,导入时可自定义名称。两者不能混在同一个 export 语句里。

  • 命名导出:export const PI = 3.14;export function add(a, b) { return a + b; }
  • 默认导出:export default function multiply(a, b) { return a * b; }(注意:不能用 function multiply() {} 单独声明再 export default multiply,除非是变量赋值形式)
  • 批量重导出:export { add as sum, PI } from './math.js';,但不会提升原始模块的执行时机

import 路径必须带扩展名或为绝对/相对 URL

ES 模块的 import 不支持 Node.js 那样的自动扩展名解析(如省略 .js)。以下写法在浏览器中全部非法:

import { add } from './math';        // ❌ 缺少扩展名
import { add } from 'lodash'; // ❌ 不是相对/绝对路径,也不是 bare specifier(需构建工具或导入映射支持)

合法写法包括:

  • import { add } from './math.js';
  • import utils from './utils.mjs';
  • import { render } from 'https://cdn.skypack.dev/react@18';(需环境支持 bare specifier)

动态 import() 是函数调用,返回 Promise,可传入变量路径,且不受静态分析限制,但无法在顶层用 await 替代(需包在 async 函数内)。

循环依赖时模块只执行一次,未执行完的部分是 undefined

如果 a.js 导入 b.js,而 b.js 又导入 a.js,V8 会缓存已初始化但未执行完的模块对象。此时 b.js 中访问 a.js 的命名导出,可能得到 undefined,尤其是导出的是 letconst 声明的值(尚未初始化)。

规避方法:

  • 把相互依赖的逻辑提到第三个模块中统一导出
  • 用默认导出函数代替直接导出变量(函数体延迟执行)
  • 避免在模块顶层直接读取对方导出的非函数值

模块加载顺序由依赖图决定,不是文件书写顺序;import 语句位置不影响执行时机——所有 import 都在模块执行前完成解析和预加载。


# react  # javascript  # java  # js  # node.js  # json  # node  # 浏览器  # 工具  # ai  # cdn  # 作用域 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: C++时间戳转换成日期时间的步骤和示例代码  bing浏览器学术搜索入口_bing学术文献检索地址  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  如何在自有机房高效搭建专业网站?  如何用PHP工具快速搭建高效网站?  js代码实现下拉菜单【推荐】  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  简单实现Android文件上传  实例解析angularjs的filter过滤器  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel如何使用Eloquent进行子查询  MySQL查询结果复制到新表的方法(更新、插入)  如何快速生成可下载的建站源码工具?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  如何基于云服务器快速搭建个人网站?  如何快速配置高效服务器建站软件?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  html如何与html链接_实现多个HTML页面互相链接【互相】  如何在 Pandas 中基于一列条件计算另一列的分组均值  用yum安装MySQLdb模块的步骤方法  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  公司网站制作需要多少钱,找人做公司网站需要多少钱?  深圳网站制作的公司有哪些,dido官方网站?  如何在万网ECS上快速搭建专属网站?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  Android 常见的图片加载框架详细介绍  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  详解jQuery中基本的动画方法  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Android利用动画实现背景逐渐变暗  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  如何用已有域名快速搭建网站?  如何在万网主机上快速搭建网站?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel如何实现用户密码重置功能?(完整流程代码)  Python并发异常传播_错误处理解析【教程】  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel如何记录自定义日志?(Log频道配置)  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何快速生成凡客建站的专业级图册?  如何在 React 中条件性地遍历数组并渲染元素  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)