node环境中ES Module与CommonJS的差异
// common.js
// 加载模块函数
console.log(require);
// 模块对象
console.log(module);
// 导出对象别名
console.log(exports);
// 当前文件绝对路径
console.log(__filename);
// 当前文件所在目录
console.log(__dirname);
执行node common.js
,这些都能够成功打印出来。而在ES Module中,打印结果都是not defined。
原因是:这几个成员都是 CommonJS把模块包装成一个函数过后,通过参数提供进来的成员。我们现在使用ES Module,它的加载方式发生了变化,所以就不再提供这几个成员了。
这几个成员中,require/module/export 我们可以通过ES Module中的import和export去代替。
而对于__filename和__dirname,我们可以通过另外一个成员去代替,这个成员就是 import.meta.url,这个url拿到的就是我们当前所工作的这个文件的文件url地址。
// 借助url中的fileUrlToPath方法,将文件url转换成路径
import { fileURLToPath } from 'url'
const __filename = fileURLToPath(import.meta.url)
console.log(__filename);
// 通过path中的dirname方法去提取__filename文件夹的部分
import { dirname } from "path"
const __dirname = dirname(__filename)
console.log(__dirname);