__dirname 在带有 webpack 捆绑的节点 js 中不起作用

Posted

技术标签:

【中文标题】__dirname 在带有 webpack 捆绑的节点 js 中不起作用【英文标题】:__dirname is not working in node js with webpack bundling 【发布时间】:2017-09-17 12:43:09 【问题描述】:

我的当前目录是

D:\bkp\Programming\TestWorks\nodejs\testApp

但是当我使用__dirname 并尝试使用快速服务器显示文件时,它给了我这个错误

Error: ENOENT: no such file or directory, stat 'D:\views\index.html'

我的代码是

res.sendFile(__dirname + 'views/index.html');

当我将它与 webpack 捆绑并运行捆绑文件时,就会发生这种情况。否则,如果我只是运行普通的 app.js 文件,它就可以正常工作。帮助将不胜感激。

【问题讨论】:

【参考方案1】:

这是因为 webpack 可以以不同的方式处理 __dirname(和其他特定于节点的东西)。如果你想让它表现得像平常一样,在你的 webpack 配置中使用它:


    node: 
        __dirname: false
    

见:https://webpack.js.org/configuration/node/

【讨论】:

一些 google 客户端库要求在 webpack.config 中将 dirname 设置为 true。但是为了从文件系统中读取邮件模板,我希望 dirname 成为输出目录。有没有办法只为某些节点模块设置它?我的当前解决方法是使用 process.cwd() 然后 /dist 作为输出目录。但我真的不喜欢那样【参考方案2】:

__dirname 被 webpack 设置为/,这就是为什么你最终会得到/views/index.html,它是你的文件系统的根,在你的情况下恰好是D:\。您可以在 webpack 配置中将 node.dirname 设置为 false 以不注入它并将其推迟到运行时。请记住,__dirname 将引用您正在执行的脚本的位置,即捆绑包的位置,而不是原始源。

node: 
  __dirname: false

【讨论】:

【参考方案3】:

"webpack": "^5.24.4" 默认值取决于target 配置属性:

target: 'web' => __dirname = '/'

target: 'node' => __dirname = 'the full path of the output directory'

可以使用node配置属性进行调整,见https://webpack.js.org/configuration/node/#node__dirname

【讨论】:

以上是关于__dirname 在带有 webpack 捆绑的节点 js 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用webpack单独导入捆绑的webpack和库?

部署新的 Webpack 包会导致错误,直到页面刷新

webpack打包后服务端__dirname失效问题

Webpack:关于__dirname如何上升一个或多个级别?

Webpack 不能使用 __dirname?

webpack学习笔记——path