在Vue.js(以及更广泛的JavaScript生态中),import
和require
是两种不同的模块导入方式,它们分别来自ES6模块系统和CommonJS模块系统。
require
- CommonJS:
require
是CommonJS模块系统的关键字,主要用于Node.js环境。 - 同步加载:
require
在执行时是同步的,意味着它会在代码执行时立即加载模块。 - 导出:使用
module.exports
或exports
来导出模块。 - 使用方式:
// 导入模块
const myModule = require('./myModule');
// 导出模块
module.exports = { myFunction };
// 或者
exports.myFunction = function() {};
import
- ES6模块:
import
是ES6模块系统的一部分,用于导入模块。 - 异步加载(通过
import()
函数):默认情况下,import
是在编译时解析的,但是可以使用import()
函数来实现动态异步加载。 - 导出:使用
export
或export default
来导出模块。 - 使用方式:
// 导入模块
import myModule from './myModule';
import { myFunction } from './myModule';
// 导出模块
export function myFunction() {};
// 或者
export default { myFunction };
使用和区别
使用上的区别:
require
可以动态地加载模块,可以在任何地方使用,包括条件语句中。import
语句是静态的,必须在文件的顶部使用,不能在条件语句中使用。
语法上的区别:
require
返回的是模块的导出对象,可以赋值给任何变量。import
需要明确指定要从模块中导入的绑定(变量、函数、类等)。
加载时间的区别:
require
在运行时加载模块,模块会被缓存,后续再次require
会取得相同的实例。import
在编译时被解析,因此它必须是静态的,不能在运行时改变。
模块缓存:
- CommonJS模块输出的是值的拷贝,一旦输出一个值,模块内部的变化就影响不到这个值。
- ES6模块输出的是值的引用,内部的变化会影响到这个值。
互操作性:
- 在Node.js中,可以使用
require
来加载ES6模块,但通常需要构建工具(如Babel)来转换ES6模块语法。 - 同样,可以使用
import()
函数来异步加载CommonJS模块。
总结
import
和require
各有优缺点,它们服务于不同的模块系统。在开发现代JavaScript应用程序时,import
是更常见的选择,因为它提供了更清晰的语法和更好的模块管理。然而,在Node.js环境中,require
仍然是标准做法,尤其是在旧版Node.js不支持ES6模块的情况下。随着Node.js对ES6模块的原生支持,import
的使用将变得更加普遍。