webpack打包后,__dirname获取不到所在路径

在用webpack打包node的后台工程后,会出现通过__dirname获取不到文件所i在路径或者为空字符串的情况,这时候只需要在webpack配置文件webpack.confg.js中将node字段设置成如下即可:

module.exports = {
	node: {
        __dirname: false
    }
}

为什么要这么设置呢,可以查看webpack官网关于配置文件中node节点的介绍:
<以下为官方文档>


Node

这些选项可以配置是否 polyfill 或 mock 某些 Node.js 全局变量和模块。这可以使最初为 Node.js 环境编写的代码,在其他环境(如浏览器)中运行。

此功能由 webpack 内部的 NodeStuffPlugin插件提供。如果 target 是 “web”(默认)或 “webworker”,那么NodeSourcePlugin 插件也会被激活。

node

object
是一个对象,其中每个属性都是 Node.js 全局变量或模块的名称,每个 value 是以下其中之一……

  • true:提供 polyfill。
  • “mock”:提供 mock 实现预期接口,但功能很少或没有。
  • “empty”:提供空对象。
  • false: 什么都不提供。预期获取此对象的代码,可能会因为获取不到此对象,触发 ReferenceError 而崩溃。尝试使用require('modulename')导入模块的代码,可能会触发Cannot find module "modulename"错误。

注意,不是每个 Node 全局变量都支持所有选项。对于不支持的键值组合(property-value combination),compiler 会抛出错误。更多细节请查看接下来的章节。
这里是默认值:

node: {
  console: false,
  global: true,
  process: true,
  __filename: "mock",
  __dirname: "mock",
  Buffer: true,
  setImmediate: true
  
  // 更多选项,请查看“其他 Node.js 核心库”
}

从 webpack 3.0.0 开始,node 选项可能被设置为 false,以完全关闭 NodeStuffPluginNodeSourcePlugin 插件。

node.console
boolean | "mock"

默认值:false

浏览器提供一个 console 对象,具有非常类似 Node.js console 的接口,所以通常不需要 polyfill。

node.process
boolean | "mock"

默认值:true

node.global
boolean

默认值:true

关于此对象的准确行为,请查看源码。

node.__filename
boolean | "mock"

默认值:“mock”

选项:

  • true: 输入文件的文件名,是相对于 context 选项。
  • false: 常规的 Node.js __filename 行为。在 Node.js 环境中运行时,输出文件的文件名。
  • “mock”: value 填充为 “index.js”.

node.__dirname
boolean | "mock"

默认值:“mock”

选项:

  • true: 输入文件的目录名,是相对于 context 选项。
  • false: 常规的 Node.js __dirname 行为。在 Node.js 环境中运行时,输出文件的目录名。
  • “mock”: value 填充为 “/”。

node.Buffer
boolean | “mock”

默认值:true

node.setImmediate
boolean | “mock” | “empty”

默认值:true

其他 Node.js 核心库(Node.js core libraries)
boolean | “mock” | “empty”

只有当 target 是未指定、“web” 或 “webworker” 这三种情况时,此选项才会被激活(通过 NodeSourcePlugin)。

NodeSourcePlugin 插件启用时,则会使用 node-libs-browser来对 Node.js 核心库 polyfill。请查看 Node.js 核心库及其 polyfills 列表。

默认情况下,如果有一个已知的 polyfill,webpack 会对每个 library 进行 polyfill,如果没有,则 webpack 不会执行任何操作。在后一种情况下,如果模块名称配置为 false 值,webpack 表现为不会执行任何操作。

为了导入内置的模块,使用 non_webpack_require,例如,使用 non_webpack_require(‘modulename’) 而不是 require(‘modulename’)。
示例:

node: {
  dns: "mock",
  fs: "empty",
  path: true,
  url: false
}

参考webpack中文网:Node

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值