Создать исполняемый файл для проекта NodeJS с архитектурой MERN - PullRequest
0 голосов
/ 23 апреля 2019

** См. РЕДАКТИРОВАТЬ ниже **

Я создал простое приложение MERN (Mongo, Express, React, NodeJS) для формирования основы проекта. Я изучаю возможные способы создания исполняемых файлов для развертывания после завершения приложения. Исполняемые файлы должны быть созданы для нескольких операционных систем и архитектур.

Приложение соответствует серверной части NodeJS, на которой запущен веб-сервер Express с доступом к экземпляру 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, но, похоже, я не могу понять это правильно.

У кого-нибудь есть решение для этого?

1 Ответ

0 голосов
/ 24 апреля 2019

Мне удалось сделать так, чтобы код рабочей пластины, полученный от https://github.com/crsandeep/simple-react-full-stack, теперь мог быть сгенерирован как исполняемый файл с использованием PKG.

Я был очень близок к тому, чтобы заставить его работать в моем редактированиина вопрос, но вот полное решение:

Убедитесь, что 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'));

to:

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

После этого необходимые файлы будут помещены в каталог dist с помощью файла package.json, а затем с помощью path.join(__dirname обеспечит их поиск вправильное место.

...