模块引入:require 与 import 的区别及演进
2023-10-07 16:38:50
引言
在 JavaScript 模块化编程中,require
和 import
都是引入依赖模块的语法。然而,这两者之间存在一些关键区别,并且随着 JavaScript 模块规范的演进,它们的用法也在不断变化。本文将对 require
和 import
的区别及其在 JavaScript 发展中的演进过程进行深入探讨。
CommonJS 规范与 require
CommonJS 是一个用于 JavaScript 模块化的规范,它起源于 2009 年,旨在解决 JavaScript 模块化编程中存在的问题,包括命名冲突、依赖管理和代码组织等。在 CommonJS 规范中,require
语法用于引入依赖模块。
require
语法的基本用法如下:
const module = require('module-name');
其中,module-name
是要引入的模块的名称。require
会返回一个模块对象,该对象包含模块导出的内容。
ECMAScript 模块与 import
ECMAScript 模块是 JavaScript 的一个模块化标准,它于 2015 年引入,旨在提供一种更简单、更一致的模块化语法。在 ECMAScript 模块中,import
语法用于引入依赖模块。
import
语法的基本用法如下:
import { exportedValue } from 'module-name';
其中,exportedValue
是要导入的模块导出的值,module-name
是要引入的模块的名称。import
语法允许你一次性导入多个模块的导出值,并且可以为导入的模块起别名。
require
与 import
的主要区别
- 语法格式:
require
语法使用require()
函数,而import
语法使用import
。 - 模块导出: 在 CommonJS 规范中,模块的导出值通常通过
module.exports
对象来指定。而在 ECMAScript 模块中,模块的导出值通过export
关键字来指定。 - 模块加载: 在 CommonJS 规范中,模块是同步加载的,这意味着
require
语法会在执行当前脚本之前加载依赖模块。而在 ECMAScript 模块中,模块是异步加载的,这意味着import
语法不会阻塞当前脚本的执行。 - 作用域: 在 CommonJS 规范中,
require
语法加载的模块的作用域是当前模块。而在 ECMAScript 模块中,import
语法加载的模块的作用域是全局的。
require
与 import
的演进
随着 JavaScript 模块规范的演进,require
和 import
的用法也在不断变化。
在 Node.js 中,最初只有 require
语法可用。然而,随着 ECMAScript 模块规范的引入,Node.js 也开始支持 import
语法。在 Node.js 14 中,import
语法被默认启用,并且建议使用 import
语法来引入依赖模块。
在浏览器中,import
语法一开始并不被支持。然而,随着 ECMAScript 模块规范的普及,浏览器也开始支持 import
语法。如今,所有主流浏览器都支持 import
语法。
结论
require
和 import
是 JavaScript 模块化编程中常用的两种语法。它们之间存在一些关键区别,并且随着 JavaScript 模块规范的演进,它们的用法也在不断变化。在 Node.js 中,建议使用 import
语法来引入依赖模块。在浏览器中,import
语法也是推荐的语法。