преобразовать es6 в обычный js в памяти и использовать его - PullRequest
0 голосов
/ 26 мая 2020

На данный момент

  1. У меня есть файл, написанный на ES6 и используемый приложением create-response-app.
  2. Я хочу загрузить этот файл в память, преобразовать его в обычный JS и использовать экспортированные значения в одном из моих сценариев, который должен быть общим JS.

Что у меня есть: (на основе сценариев реакции-шаблонов)

const fs = require('fs');
const {
  transform
} = require('@babel/core');

const readFile = fileName =>
  new Promise((resolve, reject) => {
    fs.readFile(
      fileName,
      'utf8',
      (error, value) => (error ? reject(error) : resolve(value)),
    );
  });

const extractFromFile = async() => {
  const presets = [
    [
      '@babel/preset-env',
      {
        modules: false,
      },
    ],
    '@babel/preset-react'
  ];
  const plugins = [
    '@babel/plugin-transform-modules-commonjs'
  ];

  const filename = './xyz.js';

  try {
    const code = await readFile(filename);

    const output = await transform(code, {
      filename,
      presets,
      plugins
    });

    // Here ... !!
    // if i write output.code to file and read it from, i can access the exported values
    // but if i try something like this: const foo = require(output.code) or any other
    // combination that i can think off, i get undefined or errors.

    console.log(output)

  }
}

Вопрос: как можно получить экспортированные значения этого файла, не сохраняя его сначала в файл и не требуя его обратно?

EDIT :

"... использовать экспортированные значения в одном из моих сценариев, которые должны быть общими JS ..."

Я пытаюсь создать сценарий который извлекал бы сообщения response-intl из моего проекта.

Я нашел очень полезный скрипт , написанный людьми проекта response-template, и использовал его в своем проекте.

Файл, который я пытаюсь загрузить, - это i18n. js, а в их проекте он написан общим JS с комментарием

ВАЖНО : Этот файл используется встроенным * скриптом extract-intl сборки и должен использовать синтаксис модуля Common JS * Вы НЕ МОЖЕТЕ использовать импорт / экспорт в этом файле.

НО: Я использую create- react-app и, насколько мне известно (и то, что я тестировал), я не могу использовать modules.exports, так как он нарушает скрипт yarn run build, и я не хочу извлекать приложение.

Спасибо

1 Ответ

0 голосов
/ 26 мая 2020

Я, вероятно, подхожу к этому, пытаясь изменить требование или используя сборщик.

Но, отвечая на вопрос в рамках перечисленных ограничений, я бы использовал динамическое c import в модуль Common JS. Dynami c import работает вне модулей ESM и поддерживается всеми основными современными браузерами, к сожалению, не Edge v44 и более ранними («Legacy Edge»).

Dynami c import возвращает обещание, которое выполнено с объектом пространства имен модуля модуля ESM (у которого есть свойства для экспорта):

import("/path/to/module")
.then(mod => {
    // Use `mod.x` here
})
.catch(error => {
    // Handle module load error
});

Вы даже можете определить общую JS оболочку для модуля, если хотите:

(async () => {
    module.exports = await import("/path/to/module");
})
.catch(error => {
    // Handle module load error
});

В своем обновлении вопроса вы сказали:

Файл, который я пытаюсь загрузить, - это i18n. js, и в их проекте он написан совместно JS с комментарием

ВАЖНО: этот файл используется внутренней сборкой * script extract-intl и должен использовать общий синтаксис модуля JS * Вы НЕ МОЖЕТЕ использовать импорт / экспорт в этом файле.

НО: я использую приложение create-response-app и, насколько мне известно (и то, что я тестировал), я не могу использовать modules.exports, так как он нарушает сценарий 'yarn run build', и я не хочу для извлечения приложения.

Это е ine, вы должны иметь возможность использовать его с помощью синтаксиса import (с бандлером - в вашем случае Webpack, который использует приложение create-response-app); все, что он говорит, это то, что вы не можете использовать import / export синтаксис в файле.

Если вы установите файл в node_modules, ваше приложение create-response-app build должен иметь возможность использовать его благодаря обработке модуля Webpack.

...