当前位置: 首页 > news >正文

64、js 中require和import有何区别?

在 JavaScript 中,require 和 import 都是用于模块导入的语法,但它们属于不同的模块系统,具有显著的区别:

1. 模块系统不同

require

属于 CommonJS 模块系统(Node.js 默认使用)。
语法:const module = require(‘./module’)

  • 动态加载:在代码运行时同步加载模块。
  • 可以导入任何类型的文件(.js、.json 等)。
  • 模块导出是对象(module.exports 或 exports)。

import

属于 ES6 模块系统(ECMAScript 2015+ 标准)。
语法:import module from ‘./module.js’

  • 静态加载:在代码解析阶段(编译时)确定依赖关系。
  • 默认支持 .js、.mjs 或通过 package.json 的 “type”: “module” 标记的文件。
  • 模块导出是只读的静态绑定(导出值在编译时确定)。

2. 加载时机

require

  • 同步加载:模块在代码执行到 require 时才会加载,可能阻塞后续代码。
  • 支持条件导入(如 if (condition) { require(…) })。

import

  • 静态加载:模块依赖在代码解析阶段确定,无法动态导入(但可通过 import() 动态导入)。
  • 必须写在顶层作用域(不能在条件语句或函数内使用,除非用 import())。

3. 语法差异

require

const fs = require('fs'); // 导入整个模块
const { readFile } = require('fs'); // 解构导入

import

import fs from 'fs'; // 默认导入
import { readFile } from 'fs'; // 命名导入
import * as fs from 'fs'; // 导入所有命名导出
import fs from 'fs/promises'; // 导入子模块(路径需完整)

4. 动态导入

require

直接内联使用,无需额外语法。

import

通过 import() 函数实现动态导入(返回 Promise):

const module = await import('./module.js');

5. 顶层 this 行为

require

模块中的 this 指向 module.exports。

import

模块中的 this 是 undefined(严格模式)。

6. 使用环境

require

主要用于 Node.js 环境(传统项目),或通过 Babel/Webpack 转译的浏览器代码。

import

现代浏览器原生支持(需声明 type=“module”),Node.js 从 v12 开始也支持 ES 模块(需文件后缀 .mjs 或 package.json 配置)。

7. 缓存机制

require

模块首次加载后会被缓存,后续 require 直接读取缓存。

import

同样有缓存,但行为更严格(静态分析时确定依赖)。

如何选择?

  • Node.js 项目:传统项目用 require,现代项目可用 import(需配置 “type”: “module”)。
  • 浏览器项目:优先使用 import(配合打包工具如 Webpack/Rollup)。
  • 动态加载:require 更灵活,ES 模块用 import()。

如果需要兼容性,Babel/TypeScript 可以将 import 转译为 require。

在这里插入图片描述

http://www.lqws.cn/news/202843.html

相关文章:

  • Xilinx FPGA 重构Multiboot ICAPE2和ICAPE3使用
  • LeetCode 高频 SQL 50 题(基础版)之 【子查询】· 上
  • 【力扣链表篇】19.删除链表的倒数第N个节点
  • CRMEB 中 PHP 快递查询扩展实现:涵盖一号通、阿里云、腾讯云
  • A Survey on the Memory Mechanism of Large Language Model based Agents
  • LeetCode 08.06 面试题 汉诺塔 (Java)
  • uniapp 对接腾讯云IM群公告功能
  • 图上合成:用于大型语言模型持续预训练的知识合成数据生成
  • Linux中MySQL的逻辑备份与恢复
  • NamedParameterJdbcTemplate 使用方法及介绍
  • Readest(电子书阅读器) v0.9.53
  • Python爬虫-爬取各省份各年份高考分数线数据,进行数据分析
  • 使用 C/C++ 和 OpenCV 提取图像的感兴趣区域 (ROI)
  • Mysql批处理写入数据库
  • Opencv查找图形形状的重要API讲解
  • Cursor实现用excel数据填充word模版的方法
  • C#报价系统陈列展示成本核算系统项目管理系统纸品非纸品报价软件
  • linux 用户态时间性能优化工具perf/strace/gdb/varlind/gprof
  • 让DeepSeek写2025年高考作文
  • qiankun微前端 主应用vue3+vite、子应用vue3+vite
  • 使用 C++/OpenCV 创建动态流星雨特效 (实时动画)
  • ngx_stream_geo_module在传输层实现高性能 IP Region 路由
  • 学习STC51单片机30(芯片为STC89C52RCRC)
  • 【论文阅读笔记】《A survey on deep learning approaches for text-to-SQL》
  • 以SMMUv2为例,使用Trace32可视化操作SMMU的常用命令详解
  • 深入理解 Agent 与 LLM 的区别:从智能体到语言模型
  • 反向传播的核心是什么:计算损失函数对可训练参数的梯度=== 损失函数能通过计算图连接到可训练参数
  • 快速运行Dify前端,无需搭建后端环境
  • CADisplayLink、NSTimer、GCD定时器
  • 变幻莫测:CoreData 中 Transformable 类型面面俱到(一)