一文搞懂 Node.js 中 require 和 import 的区别及最佳实践

为什么会有两套模块系统?

Node.js 诞生时,JavaScript 还没有官方的模块化标准,于是社区推出了 CommonJS 规范,也就是我们熟悉的 requiremodule.exports

后来,JavaScript 官方在 ES6 中推出了 ES Modules(ESM),也就是 importexport。但 Node.js 早期无法直接支持 ESM,直到 13.2 版本才默认支持。于是,两种模块系统“共存”至今。

require 和 import 的核心区别

加载方式:一个“同步”,一个“异步”

总结require 更灵活,但 import 性能更好 (依赖预加载)。

导出和导入:写法完全不同

注意:ESM 的 export default 对应 CommonJS 的 module.exports,而 export 对应 exports.xxx

模块是“拷贝”还是“引用”?

文件扩展名和配置

最佳实践:到底该用哪个?

新项目优先用 import(ESM)

旧项目继续用 require(CommonJS)

不要混用!

混用可能导致诡异问题。如果必须混用:

实战:用 import 写一个 Koa 服务

假设你已经安装了 Node.js v16+,跟着以下步骤操作:

初始化项目

mkdir koa-demo&& cd koa-demo
npm init -y

安装 Koa

先配置 npm 包安装源,新增 .npmrc 文件,内容如下

registry=https://registry.npmmirror.com

然后执行如下命令

npm install koa --save

创建 ES Modules 文件

package.json 中添加:

{ "type": "module" } // 启用 ESM

编写 src/app.js

import Koa from 'koa';

const app = new Koa();

// 中间件:记录请求耗时
app.use(async (ctx, next) => {
    const start = Date.now();
    await next();
    const duration = Date.now() - start;
    ctx.set('X-Response-Time', `${duration}ms`);
});

// 路由
app.use(async (ctx) => {
    ctx.body = 'Hello, 我是用 import 运行的 Koa 服务!';
});

// 启动服务
app.listen(3000, () => {
    console.log('服务已启动:http://localhost:3000');
});

运行

node src/app.js

访问 http://localhost:3000,你会看到欢迎信息!

总结

接下来,我将在 koa-demo 的基础上进行功能开发,新增通过 Markdown 发送邮件的功能。同时,我将使用 ESM 改造我的前端工具包 hui-vue。你的项目还在使用 require 吗?

相关推荐