Webpack 的误解
首先要了解的一点是webpack 不会捆绑通过fs 或其他要求文件路径的模块所需的文件。这些类型的资产通常被标记为静态资产,因为它们没有以任何方式捆绑在一起。 webpack 只会捆绑 required 或 imported (ES6) 的文件。此外,根据您的 webpack 配置,您的项目根目录可能并不总是与生产构建中的输出相匹配。
根据 electron-vue 文档的项目结构/文件树,您会发现只有 webpack 包和 static/ 目录在生产版本中可用。 electron-vue 还有一个方便的__static 全局变量,可以在开发和生产中提供指向static/ 文件夹的路径。您可以使用此变量,类似于使用 __dirname 和 path.join 访问您的 JSON 文件或任何文件的方式。
静态资产的解决方案
似乎electron-vue 样板的当前版本已经为您解决了这个问题,但我将描述如何使用webpack 进行设置,因为它不仅可以应用于 JSON 文件,而且还可以应用于申请任何webpack + electron 设置。以下解决方案假定您的 webpack 构建输出到一个单独的文件夹,在这种情况下我们将使用 dist/,假定您的 webpack 配置位于项目的根目录中,并假定 process.env.NODE_ENV 设置为 @ 987654342@ 开发期间。
static/ 目录
在开发过程中,我们需要一个地方来存储我们的静态资产,所以让我们将它们放在一个名为static/ 的目录中。在这里,我们可以放置文件,例如 JSON,我们知道我们需要使用 fs 或其他需要文件完整路径的模块来读取这些文件。
现在我们需要使 static/ assets 目录在生产版本中可用。
但是webpack 根本不处理这个文件夹,我们该怎么办?
让我们使用简单的copy-webpack-plugin。在我们的webpack 配置文件中,我们可以在构建用于生产 时添加此插件,并将其配置为将static/ 文件夹复制到我们的dist/ 文件夹中。
new CopyWebpackPlugin([
{
from: path.join(__dirname, '/static'),
to: path.join(__dirname, '/dist/static'),
ignore: ['.*']
}
])
好的,资产已投入生产,但如何在开发和生产中获取此文件夹的路径?
创建一个全局 __static 变量
使这个__static 变量有什么意义?
在 webpack + electron 设置中使用 __dirname 不可靠。在开发过程中__dirname可能引用存在于您的src/ 文件中的目录。在生产中,由于webpack 将我们的src/ 文件捆绑到一个脚本中,因此您形成的到达static/ 的路径不再存在。此外,您放在src/ 中的那些不是required 或imported 的文件永远不会进入您的生产版本。
在处理与开发和生产的项目结构差异时,在开发过程中尝试获取static/ 的路径将非常烦人,必须始终检查您的process.env.NODE_ENV。
让我们通过创建一个事实来源来简化这一点。
使用webpack.DefinePlugin,我们可以设置__static 变量仅在开发中,以生成指向<projectRoot>/static/ 的路径。根据您是否有多个 webpack 配置,您可以将其应用于 main 和 renderer 进程配置。
new webpack.DefinePlugin({
'__static': `"${path.join(__dirname, '/static').replace(/\\/g, '\\\\')}"`
})
在生产中,我们需要在代码中手动设置__static 变量。这是我们可以做的...
index.html(renderer 进程)
<!-- Set `__static` path to static files in production -->
<script>
if (process.env.NODE_ENV !== 'development') window.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
</script>
<!-- import webpack bundle -->
main.js(main 进程)
// Set `__static` path to static files in production
if (process.env.NODE_ENV !== 'development') {
global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
}
// rest of application code below
现在开始使用你的 __static 变量
假设我们有一个简单的 JSON 文件,需要使用 fs 读取,这就是我们现在可以完成的事情......
static/someFile.json
{"foo":"bar"}
someScript.js(renderer或main进程)
import fs from 'fs'
import path from 'path'
const someFile = fs.readFileSync(path.join(__static, '/someFile.json'), 'utf8')
console.log(JSON.parse(someFile))
// => { foo: bar }
结论
webpack 用于将 required 或 imported 的资产捆绑到一个漂亮的捆绑包中。使用fs 或其他需要文件路径的模块引用的资产被视为静态资产,webpack 不直接处理这些。使用copy-webpack-plugin 和webpack.DefinePlugin,我们可以设置一个可靠的__static 变量,该变量在开发和生产环境中生成static/ 资产目录的路径。
最后,我个人还没有看到任何其他 webpack + electron 样板处理这种情况,因为这不是很常见的情况,但我认为我们都同意拥有一个 来源事实 到静态资产目录是缓解开发人员疲劳的绝妙方法。