在使用Webpack打包Node.js时,__dirname无法正常工作

15

我的当前目录是

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

但是当我在使用 __dirname 并尝试在 Express 服务器中展示文件时,会出现以下错误

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

我用的代码是:

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

当我使用webpack捆绑并运行捆绑文件时,就会出现这种情况。否则,如果我只是运行正常的app.js文件,它就能正常工作。希望能得到帮助。

3个回答

23

这是因为Webpack可以以不同的方式处理__dirname(和其他特定于Node的东西)。如果您希望它的行为像平常一样,将以下内容添加到您的Webpack配置中:

{
    node: {
        __dirname: false
    }
}

请参阅:https://webpack.js.org/configuration/node/


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

12

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

node: {
  __dirname: false
}

4

1
我认为这应该被标记为最佳答案(至少对于webpack 5来说)。 - Sergio Mazzoleni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接