浅析nodejs中的__dirname和__filename变量

本篇文章带大家了解一下node中你不知道的__dirname__filename变量,有一定的参考价值,希望对大家有所帮助!

浅析nodejs中的__dirname和__filename变量

1.问题背景

写这篇文章的背景在于今天遇到一个神奇的报错,一起来看下

// index.jsconsole.log(__filename);// 执行 node index.js// ReferenceError: __filename is not defined in ES module scope

登录后复制

在node环境访问全局变量__filename居然报错,什么原因呢??于是开始了一路的探索,最终找到问题的根源。

2. node模块机制

我们知道早期node的模块标准采用commonjs模块规范,然而在nodejs版本v13.2.0中,开始支持ES Modules模块规范,我们可以有以下几种方式在node中使用ES Modules模块

将文件后缀命名为.mjspackage.json 新增 “type”: “module”字段

当我们在node中使用ES Modules贵方,以下全局对象和变量将不可用

requiremodule.exportsexports__filename__dirnameNODE_PATH

3. 为什么采用commonjs模块化可以使用__filename和__dirname?

这个问题,主要归结于commonjs模块下nodejs的运行机制,很多人可能认为__filename就是node环境中的全局变量,当出现这个问题的时候,我们才意识到,这两个不是Node中真正的全局变量。

看一段简单的js代码

(function(){    console.log(arguments) // [1,2,3]})(1,2,3)

登录后复制

arguments在函数内部可以拿到调用函数时传入的参数。

我们在node commonjs模块中执行以下代码

// index.jsconsole.log(arguments);[Arguments] {  '0': {},  '1': [Function: require] {    resolve: [Function: resolve] { paths: [Function: paths] },    main: Module {      id: '.',      path: 'E:\nodeProjectStorehouse\nodeStudyFromBook',      exports: {},      filename: 'E:\nodeProjectStorehouse\nodeStudyFromBook\cc.cjs',      loaded: false,      children: [],      paths: [Array]    },    extensions: [Object: null prototype] {      '.js': [Function (anonymous)],      '.json': [Function (anonymous)],      '.node': [Function (anonymous)]    },    cache: [Object: null prototype] {      'E:\nodeProjectStorehouse\nodeStudyFromBook\cc.cjs': [Module]    }  },  '2': Module {    id: '.',    path: 'E:\nodeProjectStorehouse\nodeStudyFromBook',    exports: {},    filename: 'E:\nodeProjectStorehouse\nodeStudyFromBook\cc.cjs',    loaded: false,    children: [],    paths: [      'E:\nodeProjectStorehouse\nodeStudyFromBook\node_modules',      'E:\nodeProjectStorehouse\node_modules',      'E:\node_modules'    ]  },  '3': 'E:\nodeProjectStorehouse\nodeStudyFromBook\cc.cjs',  '4': 'E:\nodeProjectStorehouse\nodeStudyFromBook'

登录后复制

我们可以看到,arguments有5个参数,这5个参数就是exports, require, module, __filename, __dirname

到这里我们就清楚的知道,__filename不是全局变量,而是外层传入的参数而已

既然这样,我们在ES Modules模块下,访问arguments看下结果是什么?

// index.js ES modulesconsole.log(arguments);// ReferenceError: arguments is not defined

登录后复制

4. ES Modules下如何使用__filename和__dirname?

node官方文档建议使用import.meta.url变相的提供

// import.meta.url 返回模块的绝对的 `file:` URL。// url模块中fileURLToPath()函数,返回完全解析的特定于平台的 Node.js 文件路径// path模块中dirname()函数,返回路径的目录路径import { fileURLToPath } from 'url';import { dirname } from 'path';const __filename = fileURLToPath(import.meta.url);const __dirname = dirname(__filename);

登录后复制

更多node相关知识,请访问:node!!

以上就是浅析nodejs中的__dirname和__filename变量的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2633419.html

(0)
上一篇 2025年3月7日 04:21:26
下一篇 2025年3月5日 16:42:50

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论