Как динамически импортировать или требовать файл js в зависимости от того, является ли он средой разработки или производства? - PullRequest
0 голосов
/ 18 февраля 2020

Проблема

Я знаю, что ES6 imports и NODE require() используют анализ stati c и не поддерживают динамические c пути. Но как нам обойти это? Какое решение?

Приложение My Electron во время установки копирует файл shortcuts.js из папки разработки (проекта) [project_dir]/public/resources в папку [app_installation_dir]/resources.

Итак, проблема в следующем:

  • В разработке приложение должно импортировать ../public/resources/shortcuts.js
  • В процессе производства приложение должно импортировать [app_installation_dir]/resources/shortcuts.js

Я не могу указать путь "non-dynamici c" для производства, так как заранее не знаю, каким будет [app_installation_dir] путь.

Код

I пробовал следующее, но, как ожидается, работает только else бранч:

const shortcuts = process.env.NODE_ENV === 'production'
  ? require(`${process.resourcesPath}/shortcuts.js`).data
  : require(../public/resources/shortcuts.js`).data

После установки приложения в производстве я получаю сообщение об ошибке:

Uncaught Error: Cannot find module [app_installation_dir]/resources/shortcuts.js

, поскольку я думаю, require не видит динамический c путь как нечто, что он может импортировать (я проверил, файл существует по этому пути).

Затем я преобразовал файл из module.exports в export default {} и пробовал следующий метод ES6, но я получаю ту же ошибку:

if (process.env.NODE_ENV === 'production') {
  const importPath = path.join(process.resourcesPath, 'shortcuts.js')
  import(importPath)
    .then((data) => {
      console.log('IMPORT DATA', data)
    })
}
else if (process.env.NODE_ENV === 'development') {
  import('../public/resources/shortcuts.js')
    .then((data) => {
      console.log('IMPORT DATA', data)
    })
}

babel.config. js

module.exports = {
  presets: [  
    '@vue/cli-plugin-babel/preset',
  ]
}

Проект создан

vue create app-name
> selected [babel, eslint]


vue add electron-builder

1 Ответ

1 голос
/ 18 февраля 2020

Интересно. Я не понимаю, почему метод require не работает, если путь абсолютен. Если бы ярлыки. js содержали данные, которые могли быть экспортированы как простые JSON, возможно, я бы попытался преобразовать этот файл в json и использовать файловую систему для его чтения и анализа.

import fs from 'fs'

const shortcuts = JSON.parse(process.env.NODE_ENV === 'production'
  ? fs.readFileSync(`${process.resourcesPath}/shortcuts.json`).toString())
  : fs.readFileSync(`../public/resources/shortcuts.js`).toString()).data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...