__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和库?