@babel/polyfill (бета-версия Babel 7) вызывает SyntaxError

Пожалуйста, не отмечайте это как дубликат вопросов по Babel 6, потому что это касается конкретно Babel 7!

Я пробую новую бета-версию Babel 7 (@babel/[email protected] и т. д.), и у меня возникают проблемы с использованием @babel/polyfill.

Резюме

  • Когда я создаю проект с помощью Webpack, все работает нормально.
  • Когда я пытаюсь запустить его из командной строки, я получаю SyntaxError.

Я, наверное, просто забыл что-то простое, но я не могу понять, что. Есть идеи, в чем проблема?

Спецификация системы

  • macOS High Sierra для разработчиков, бета-версия 5
  • Узел 8.9.1
  • НПМ 5.5.1

Файлы

.babelrc.js

module.exports = {
  presets: [
    ['@babel/preset-env', { targets: { node: 6 } }],
    ['@babel/preset-stage-3'],
    ['@babel/preset-flow']
  ]
}

источник/index.js

require('@babel/polyfill')
module.exports = require('./main')

источник/main.js

import 'dotenv-safe/config'

Командная строка

$ node --trace-warnings ./src/index.js

Сообщение об ошибке

import 'dotenv-safe/config'
^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:599:28)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Module.require (module.js:579:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/deniz/Code/my-project/src/index.js:3:18)

пакет.json

{
  "name": "foobar",
  "private": true,
  "version": "1.0.0",
  "description": "lol",
  "main": "./dist/bundle.js",
  "module": "./src/main.js",
  "scripts": {
    "clean": "rimraf dist",
    "build": "webpack",
    "watch": "webpack -w",
    "flow": "flow",
    "flow-typed": "flow-typed",
    "dev": "node --trace-warnings ./src/index.js",
    "start": "node ./dist/bundle.js"
  },
  "devDependencies": {
    "@babel/cli": "^7.0.0-beta.32",
    "@babel/core": "^7.0.0-beta.32",
    "@babel/preset-env": "^7.0.0-beta.32",
    "@babel/preset-flow": "^7.0.0-beta.32",
    "@babel/preset-stage-3": "^7.0.0-beta.32",
    "babel-eslint": "^8.0.2",
    "babel-loader": "^8.0.0-beta.0",
    "dotenv-safe": "^4.0.4",
    "eslint": "^4.12.0",
    "eslint-config-prettier": "^2.9.0",
    "eslint-plugin-flowtype": "^2.39.1",
    "eslint-plugin-prettier": "^2.3.1",
    "flow-bin": "^0.59.0",
    "flow-typed": "^2.2.3",
    "prettier": "^1.8.2",
    "rimraf": "^2.6.2",
    "webpack": "^3.9.1"
  },
  "dependencies": {
    "@babel/polyfill": "^7.0.0-beta.32",
    "node-schedule": "^1.2.5"
  }
}

webpack.config.js

const path = require('path')

module.exports = {
  target: 'node',
  entry: ['./src/index.js'],
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        include: [path.resolve(__dirname, 'src')],
        loader: 'babel-loader'
      }
    ]
  },
  externals: [
    {
      mariasql: true,
      msnodesql: true,
      msnodesqlv8: true,
      mysql: true,
      mysql2: true,
      oracle: true,
      oracledb: true,
      'pg-query-stream': true,
      pg: true,
      sqlite3: true,
      'strong-oracle': true,
      tds: true
    }
  ],
  devtool: 'source-map'
}

person damd    schedule 01.12.2017    source источник
comment
SyntaxError: Unexpected token import - Nodejs еще не поддерживает импорт, попробуйте require('dotenv-safe/config')   -  person DSCH    schedule 01.12.2017
comment
@DSCH: Да, но именно поэтому я делаю require('@babel/polyfill') в index.js, а затем, когда я require('./main.js'), у меня сложилось впечатление, что я смогу использовать import?   -  person damd    schedule 01.12.2017
comment
Кстати, я надеюсь, что вы, ребята, не считаете это дубликатом, потому что Babel 7 работает немного иначе, чем Babel 6, когда дело доходит до конфигурации, поэтому решение не обязательно одно и то же!   -  person damd    schedule 01.12.2017
comment
AFAICT это не имеет ничего общего с babel 6 v 7: вы не можете полифилить import. Период. Вы должны транспилировать его. Используйте для этой цели один из многих плагинов babel. Также обратите внимание, что, хотя спецификация не требует этого, каждая нативная реализация модулей ATM требует расширения файла .js, поэтому, если вы не хотите использовать нетранспилированный в браузере, вам нужно его добавить.   -  person Jared Smith    schedule 01.12.2017


Ответы (1)


Попробуйте изменить ключ точки входа entry на: entry: ['babel-polyfill', './src/index.js']. Согласно документам, полифил должен быть в верхней части вашей точки входа. https://babeljs.io/docs/usage/polyfill

person DSCH    schedule 01.12.2017