1

**见下面的编辑**

我创建了一个简单的 MERN(Mongo、Express、React、NodeJS)应用程序来构成项目的基础。我正在探索应用程序完成后创建用于部署的可执行文件的可能方法。应该为多个操作系统和体系结构创建可执行文件。

该应用程序符合一个 NodeJS 后端,它运行一个 Express Web 服务器,可以访问一个 MongoDB 实例(它实际上是 NeDB,但为了简单起见,我只是称它为 Mongo),前端是用 React 创建的。

我尝试过使用PKG并简要了解了nexe,看起来这些工具中的任何一个都应该为我提供解决方案。

但是,由于我的项目的文件结构,我遇到了一些问题。我的应用程序的文件夹结构如下:

/
/server
....<express files>
....package.json
/client
....<react files>
....package.json
package.json

npm start这种文件夹结构的原因是允许我的应用程序通过从根目录运行来运行服务器和客户端应用程序。这是通过使用package.json具有以下内容的根文件夹的文件来完成的:

{
  "name": "MyApplication",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "client": "cd client && npm start",
    "server": "cd server && npm start",
    "start": "concurrently \"npm run server\" \"npm run client\" --kill-others"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "concurrently": "3.5.1"
  },
  "pkg": {
    "assets": [
      "client/*",
      "server/*"
    ]
  }
}

本质上,我正在尝试创建一个模仿我npm start在根目录下运行时的行为的可执行文件。可执行文件应该在目录中启动后端服务,server并且还应该在目录中执行 React 代码client

如您所见,我尝试添加一些参数,pkg但这似乎不起作用。

有没有办法配置 PKG 或任何其他类似的工具来产生我正在寻找的东西?或者我是否必须为服务器和客户端都有一个单独的可执行文件?理想情况下,我只想要一个文件。

提前致谢。

**编辑**

我遇到了以下样板应用程序,它基本上实现了我正在寻找的东西:https ://github.com/crsandeep/simple-react-full-stack

但是,我正在努力使其与 PKG 一起使用。我已经能够成功生成一个.exe文件,但遗憾的是,当我在浏览器 (localhost:8080) 中加载根页面时,它会显示错误消息Cannot GET /,但示例 API 调用工作正常。

我猜这是由于我的package.json文件中缺少某些内容,但我似乎无法解决。如果不使用 PKG 运行应用程序,它可以正常工作。

以下是package.json我对文件所做的补充:

"pkg": {
    "scripts": "./dist/bundle.js",
    "assets": [
      "./dist/index.html",
      "./dist/favicon.ico"
    ]
  },
  "bin": "src/server/index.js"

然后我使用以下语句运行 PKG(来自与 相同的目录package.json

pkg . --target node10-win-x64 --out-dir ../

我已经尝试了许多不同的项目组合,package.json但我似乎无法做到正确。

有人对此有解决方案吗?

4

1 回答 1

0

我设法做到了,所以现在可以使用 PKG 将我从https://github.com/crsandeep/simple-react-full-stack获得的样板代码生成为可执行文件。

我非常接近让它在我对问题的编辑中起作用,但这是完整的解决方案:

确保package.json包含以下内容:

"pkg": {
  "scripts": "./dist/bundle.js",
  "assets": [
    "./dist/index.html",
    "./dist/favicon.ico"
  ]
},
"bin": "src/server/index.js"

然后,在src/server/index.js文件中更改以下行:

app.use(express.static('dist'));

至:

const path = require('path');
app.use(express.static(path.join(__dirname, '../../dist')));

然后,这将使用该package.json文件将必要的文件放入 dist 目录,然后使用path.join(__dirname确保它在正确的位置查找它们。

于 2019-04-24T14:01:45.277 回答