Проблема с экспортом node.js - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь импортировать переменную из одного js файла в другой в среде node.js. Вот файлы с только важными битами -

file1. js

var socket = io.connect();
export default socket;

file2. js

import socket from "./chat.js";

My file1. js показал ошибку, что Uncaught SyntaxError: Неожиданный токен 'export'. Я искал net, и причина была в том, что я пытаюсь использовать синтаксис импорта / экспорта ES6 в среде node js. Поэтому я запустил файл моего сервера. js с помощью пакета esm.

node -r esm app. js

app. js file -

const express = require('express');
const app = express()

app.get('/', function (req, res) {
  res.sendFile(__dirname+'/index.html')
})

app.use(express.static(__dirname))

app.listen(3000, () => console.log('Example app listening on port 3000!'))

Это тоже не работает, возвращает ту же ошибку неожиданный экспорт токена . Кто-нибудь может мне помочь, пожалуйста?

Примечание: - Файл моего приложения. js - это простой файл express, в котором есть запрос на получение страницы HTML с использованием файла1. js.

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Если вы не хотите использовать синтаксис модулей ESM, этот код будет работать:

file1. js:

const socket = { test: 1 }
module.exports = socket

file2. js:

const socket = require('./file1')
console.log(socket)

Запуск node file2.js войдет в систему { test: 1 }. Он использует синтаксис модуля узла, а не ESM, но работает.

0 голосов
/ 15 апреля 2020
Синтаксическая функциональность

export/import изначально поддерживается в версии узла 13.2.0 +, но поскольку их реализация остается экспериментальной и, вероятно, может быть изменена. Это немного утомительно, вы можете следовать указаниям , чтобы использовать систему модулей.

Другой способ - использовать такой транспайлер, как babel, который в конечном итоге преобразует ваш синтаксис export/import в require / Общий JS синтаксис модуля. Шаблон может выглядеть следующим образом:

пакет. json

{
   "name":"demo-application-babel",
   "version":"1.0.0",
   "description":"",
   "main":"index.js",
   "scripts":{
      "start":"nodemon --exec babel-node app.js",
      "test":"echo \"No test specified\" && exit 0"
   },
   "keywords":[

   ],
   "author":"",
   "license":"ISC",
   "devDependencies":{
      "@babel/core":"^7.2.2",
      "@babel/node":"^7.2.2",
      "@babel/preset-env":"^7.2.3",
      "nodemon":"^1.18.9"
   },
   "dependencies":{
      "dotenv":"^8.2.0",
      "cors":"^2.8.4",
      "express":"^4.14.1"
   }
}

.babelr c (также размещен на root уровень)

{
  "presets": [
    "@babel/preset-env"
  ]
}

Шаги:

  • npm install -g nodemon
  • В проекте root: npm install
  • npm run start

И, наконец, самый простой способ - использовать встроенную модульную систему Common JS (которая является спецификацией платформы узла (на стороне сервера) c и не будет работать в браузер) с module.exports, exports и require, как было предложено в предыдущем ответе.

0 голосов
/ 15 апреля 2020

Use может использовать alanode двоичный файл из транспортера ÀLaMode (0 зависимостей в отличие от Babel ~ 250), который выполняет регулярное выражение на основе импорта в модули в Node.

npm i alanode --save-dev
yarn add alanode

Затем добавьте в пакет. json скрипт:

{
  "name": "your-package",
  "scripts": {
    "test": "...etc",
    "alanode": "alanode"
  }
}

После этого вы можете запускать свои скрипты с ним:

$> npm run alanode -- app

Или, если используете пряжу, просто следующее, и вы не нужно добавлять скрипт в пакет. json:

$> yarn alanode app

Если вы хотите запустить стандартный узел без прокси alanode, вам нужно создать файл, который требует alamode, например, src/index.js:

require('alamode')()
require('./app')

Это называется require hook : каждый файл JS будет сначала запускаться с функцией транспиляции для обновления этих импортов до require заявления и экспорт в module.export назначения. Таким образом, импорт будет переноситься автоматически, даже если вы работаете с простым Node. Затем вы также можете собрать свой исходный код:

$> yarn alamode src -o build -s

Где -o - это папка сборки, а -s означает, что нет исходных карт, которые вам не нужны, так как вывод очень похож на оригинал , за исключением того, что импорт / экспорт изменены.

Разница между yarn и npm заключается в том, что при двоичной установке локальной зависимости (она имеет bin в package.json), yarn может быть использован только для запуска yarn <name-of-bin>, чтобы запустить его, но npm не может, поэтому вам нужно создать скрипт для него и даже затем добавить --, чтобы аргументы передавались.

Просто предостережение: если у вас есть строки шаблонов, использующие протокол с //, ÀLaMode может сломаться, например,

const URL = `ws://localhost`
export default socket

const something else = `test`

, поэтому вам нужно слегка настроить код, например

const URL = `ws:/` + `/localhost

, поскольку 2 последовательных слеша вызывают замену комментария, чтобы предотвратить ложные срабатывания. Это немного неудобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...