У меня есть проект машинописного текста, в котором используется один из наших узловых модулей, который обычно запускается в нашем интерфейсе. Теперь мы хотим использовать этот модуль в узле на нашем сервере.

Модуль использует синтаксис импорта es6 import { props } from 'module/file'

Когда я включаю ссылку в машинописный текст, используя любой из следующих методов

import { props } from 'module/file';
var props = require('module/file');

Я получаю следующую ошибку из машинописного текста

unexpected token 'import' 
(function (exports, require, module, __filename, __dirname) { import

Переписать модуль - большая работа, и я пробовал использовать babel с babel-plugin-dynamic-import-node, а также с SystemJS.

Проблема с этими системами в том, что все они асинхронны, поэтому я не могу импортировать модуль стандартным способом, поэтому мне нужно было бы сделать целую кучу переписывания, когда мы дойдем до того, что я могу использовать импорт изначально. в node.js.

Я не могу быть первым, у кого возникла эта проблема, но я не могу найти рабочего решения.

--------------- обновление с настройкой -------------

В ответ на ответ @ DanielKhoroshko. Исходный модуль, который я пытаюсь импортировать, обычно упаковывается с помощью webpack для использования во внешнем интерфейсе. Теперь я пытаюсь использовать этот же модуль как на стороне сервера, так и во внешнем интерфейсе (через веб-пакет в интерфейсе), не переписывая imports для использования require и не запуская веб-пакет для связать js-файлы для использования на сервере.

Чтобы было ясно, исходный модуль написан на JS, наша служба, которая пытается использовать этот модуль, написана на машинописном тексте и передана. Когда машинописный текст пытается require старый модуль, который использует import, именно на этом этапе мы сталкиваемся с проблемой.

------------------ некоторый прогресс ---------------------------

Я добился некоторого прогресса, создав файл в моем импортированном модуле, который использует babel в node.js для преобразования кода es6 в модули commonJS.

Я сделал это через

var babel = require("babel-core")

var store = babel.transformFileSync(__dirname + '/store.js', {
    plugins: ["transform-es2015-modules-commonjs"]
});

module.exports = {
    store: store.code
}

Теперь я могу получить store в моем новом проекте node.js. Однако подмодули в файле store.js не включаются в экспорт.

Итак, где в моем модуле написано import activities from './reducers/activities'; Я теперь получаю ошибку Cannot find module './reducers/activities'

Как я могу заставить babel выполнить глубокий обход, чтобы включить подкаталоги?

1
pedalpete 31 Дек 2017 в 08:31

2 ответа

Лучший ответ

@Daniel Khoroshko был прав во многих отношениях, в итоге я нашел @std/esm, который позволяет импортировать модули es6, а также сработал поиск для получения включенного импорта.

var babel = require('babel-register')({
    presets: ["env"]
});

    require = require('@std/esm')(module);

    var store = require('ayvri-viewer/src/store');

    exports.default = {
        store: store
    }

Мне пришлось запустить babel, чтобы получить последовательную сборку от es6 до узла, совместимого с es5

1
pedalpete 2 Янв 2018 в 10:18

unexpected token 'import' означает, что вы запускаете код es-модулей в среде, которая не поддерживает команды import/export. Если вы пишете код на TypeScript, важно сначала его транспилировать перед сборкой для браузера или использовать ts-node для запуска на стороне сервера.

Если вы используете webpack, есть загрузчики ts-loader и awesome-typescript-loader

Какая у вас установка?


Чтобы описать модуль, вам нужно создать файл activities.d.ts в той же папке, где находится js-версия (я понял, что она называется activities.js и содержит reducer) со следующим (приблизительно):

import { Reducer } from 'redux';

export const activities: Reducer<any>;
1
Daniel Khoroshko 2 Янв 2018 в 02:08