主要区别
- 语法风格:
require()
是Node.js早期的模块加载方式,采用CommonJS规范,使用函数调用的形式,例如const module = require('module - name');
。
import()
是ES2020引入的动态导入语法,采用ES6模块规范,使用关键字import
,例如import('module - name').then(module => { /* 使用模块 */ });
。
- 加载时机:
require()
是同步加载,会在模块被调用时立即加载并执行模块代码。这意味着如果模块加载时间较长,可能会阻塞主线程,影响程序的执行效率。
import()
是异步加载,不会阻塞主线程。它返回一个Promise对象,可以在模块加载完成后通过.then()
处理,适合加载一些耗时的模块,不影响主线程的其他操作。
- 适用环境:
require()
主要用于Node.js环境中,虽然在一些支持CommonJS规范的JavaScript运行时(如Browserify在浏览器中模拟CommonJS环境)也能使用,但不是原生支持。
import()
既可以在Node.js环境(Node.js从v13.2.0开始支持顶级await,对import()
支持更好),也可以在现代浏览器环境中使用,是ES6模块规范的一部分。
适合使用require()
进行动态模块加载的场景
- 启动时配置加载:
当应用程序在启动阶段,需要根据不同的配置文件加载不同的模块时,
require()
的同步加载特性可以确保在应用启动过程中,相关模块已经加载并准备就绪。例如,一个应用程序可能根据环境变量决定加载不同的数据库连接模块:
const env = process.env.NODE_ENV;
let dbModule;
if (env === 'development') {
dbModule = require('./db - development');
} else {
dbModule = require('./db - production');
}
// 使用dbModule进行数据库操作
- 简单工具类模块加载:
对于一些简单的工具类模块,加载速度快且不需要异步操作,
require()
简单直接。例如,加载一个用于格式化日期的工具模块:
const dateFormatter = require('./date - formatter');
const currentDate = new Date();
const formattedDate = dateFormatter.format(currentDate);
console.log(formattedDate);