браузер выдает ошибку ключевого слова экспорта / импорта, даже если установлен webpack и babel

Я разрабатываю очень простое и простое приложение с основным javascript и html. Я установил webpack v 4 и запустил сервер, используя

npm run webpack

проект успешно скомпилирован; ниже вывод

> [email protected] webpack /opt/parixan/canvas
> webpack-dev-server --inline --hot

ℹ 「wds」: Project is running at http://localhost:8080/
ℹ 「wds」: webpack output is served from /
ℹ 「wdm」: Hash: 99985e9b8632c783a375
Version: webpack 4.12.1
Time: 819ms
Built at: 2018-06-30 18:45:48
        Asset     Size  Chunks             Chunk Names
    bundle.js  354 KiB    main  [emitted]  main
bundle.js.map  406 KiB    main  [emitted]  main
Entrypoint main = bundle.js bundle.js.map
[./js/color.js] 359 bytes {main} [built]
[./js/index.js] 628 bytes {main} [built]
[./node_modules/loglevel/lib/loglevel.js] 7.68 KiB {main} [built]
[./node_modules/sockjs-client/dist/sockjs.js] 176 KiB {main} [built]
[./node_modules/url/url.js] 22.8 KiB {main} [built]
[./node_modules/webpack-dev-server/client/index.js?http://localhost:8080] (webpack)-dev-server/client?http://localhost:8080 7.75 KiB {main} [built]
[./node_modules/webpack-dev-server/client/overlay.js] (webpack)-dev-server/client/overlay.js 3.58 KiB {main} [built]
[./node_modules/webpack-dev-server/client/socket.js] (webpack)-dev-server/client/socket.js 1.05 KiB {main} [built]
[./node_modules/webpack-dev-server/node_modules/strip-ansi/index.js] (webpack)-dev-server/node_modules/strip-ansi/index.js 161 bytes {main} [built]
[0] multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./js/index.js 52 bytes {main} [built]
[./node_modules/webpack/hot sync ^\.\/log$] (webpack)/hot sync nonrecursive ^\.\/log$ 170 bytes {main} [built]
[./node_modules/webpack/hot/dev-server.js] (webpack)/hot/dev-server.js 1.6 KiB {main} [built]
[./node_modules/webpack/hot/emitter.js] (webpack)/hot/emitter.js 77 bytes {main} [built]
[./node_modules/webpack/hot/log-apply-result.js] (webpack)/hot/log-apply-result.js 1.27 KiB {main} [built]
[./node_modules/webpack/hot/log.js] (webpack)/hot/log.js 1010 bytes {main} [built]
    + 14 hidden modules
ℹ 「wdm」: Compiled successfully.

но когда я перехожу на localhost: 8080 / алфавит.html, он выдает ошибку в консоли

Uncaught SyntaxError: Неожиданный экспорт токена. алфавит.js: 30

Я также заметил, что в папке build нет файла bundle.js, как упоминалось в webpack.config.js

вот моя структура папки

├── README.md
├── alphabet.css
├── alphabet.html
├── build
├── fruits
├── js
      ├── alphabet.js
      ├── color.js
      └── index.js
├── .babelrc
├── package.json
└── webpack.config.js
  • узел -v 8.9.2
  • npm -v 5.5.1
  • macOS -v 10.13.3
  • babel --version
    6.26.0 (babel-core 6.26.3)

.babelrc

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

package.json

 "scripts": {
    "webpack": "webpack-dev-server --inline --hot",
    "start": "http-server"
  },
  "main": "./js.index.js",

  "devDependencies": {
    "@babel/core": "^7.0.0-beta.51",
    "babel-loader": "^8.0.0-beta.4",
    "babel-register": "^6.26.0",
    "jsxobj": "^1.1.0",
    "webpack": "^4.12.1",
    "webpack-cli": "^3.0.8",
    "webpack-dev-server": "^3.1.4",
    "webpack-node-externals": "^1.7.2"
  },
  "dependencies": {
    "@babel/preset-env": "^7.0.0-beta.51",
    "babel-eslint": "^7.2.3",
    "babel-preset-es2015": "^6.24.1",
    "path": "^0.12.7"
  }

webpack.config.js

module.exports = {
  context: __dirname,
  entry: "./js/index.js",
  mode: "development",
  output: {
    path: __dirname + "/build",
    filename: "bundle.js"
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-env"]
          }
        }
      }
    ]
  },
  devtool: "source-map",
  resolve: {
    extensions: [".html", ".js", ".json", ".css"]
  }
};

/js/index.js

import { fetchImage } from "./alphabet.js";
import { color } from "./color.js";


const colorBox = color;
console.log("colorBox", colorBox);

const len = Object.keys(colorBox).length;

fetchImage(colorBox);

js / алфавит.js

export const fetchImage = letter => {
  const fruit = fruits[letter] || "tamarindo";
  const request = new Request(`./fruits/${fruit}.png`, myInit);
  fetch(request)
    .then(response => response.blob())
    .then(blob => {
      const objectURL = URL.createObjectURL(blob);
      const img = new Image(200);
      img.src = objectURL;
      let element = document.getElementById("figure");
      while (element.firstChild) {
        element.removeChild(element.firstChild);
      }
      element.appendChild(img);
    });
};

Мое главное сомнение по поводу этого файла алфавит.html

алфавит.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Alphabet</title>
   <link rel="stylesheet" href="./alphabet.css">
</head>
<body>
    <div class="content" >
    <section class="alphabet"></section>
    <figure id="figure"></figure>
</div>
<script  src="./js/alphabet.js"></script>
</body>
</html>

Если я изменю <script src="./js/index.js">, он выдаст ошибку

Uncaught SyntaxError: Неожиданный токен {

т.е. ключевые слова import и export не распознаются

Как решить эту проблему?


person diEcho    schedule 30.06.2018    source источник
comment
Вы пробовали использовать <script type="module" ... />? Если цель - использовать операторы import и export, которые должны работать.   -  person somethinghere    schedule 30.06.2018
comment
вау .. это работает как по волшебству. пожалуйста, добавьте это как ответ   -  person diEcho    schedule 30.06.2018
comment
1: webpack-dev-server собирает пакеты прямо в память, поэтому считается, что лучше иметь html-webpack-plugin, поэтому пакеты автоматически вставляются в ваш html. 2: вы получаете эту ошибку, потому что вы ссылаетесь на файл es6, а не на фактический пакет. Это может работать не во всех браузерах.   -  person PlayMa256    schedule 30.06.2018
comment
Спасибо @MatheusSilva за эту информацию, но как и что писать для html-webpack-plugin   -  person diEcho    schedule 30.06.2018
comment
github.com/jantimon/html-webpack-plugin Вам просто нужен параметр шаблона   -  person PlayMa256    schedule 01.07.2018


Ответы (2)


Если ваша цель - разрешить использование операторов import и export, вам следует использовать тип module в теге скрипта:

<script type="module" ... />

Это будет игнорироваться старыми браузерами, которые его не поддерживают, а это означает, что вы можете быть уверены, что старые браузеры даже не попытаются это проанализировать. Чтобы убедиться, что новые браузеры не анализируют старый код, вы можете использовать nomodule:

<script type="text/javascript" nomodule ... />

См. Документацию по MDN для получения дополнительной информации об использовании тега <script> следующим образом: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script

person somethinghere    schedule 30.06.2018

1: webpack-dev-server собирает пакеты прямо в память, поэтому считается, что лучше иметь html-webpack-plugin, поэтому пакеты автоматически вставляются в ваш html.

2: вы получаете эту ошибку, потому что вы ссылаетесь на файл es6, а не на фактический пакет. Это может работать не во всех браузерах.


Чтобы использовать html-webpack-plugin, просто добавьте это в файл build. Ps: ожидается, что у вас будет базовый html, в который будут вставлены активы.

https://github.com/jantimon/html-webpack-plugin

plugins: [
    new HtmlWebpackPlugin({
      template: 'path/to/my/index.html'
    })
  ]
person PlayMa256    schedule 01.07.2018
comment
это дает эту ошибку при запуске веб-пакета: Child html-webpack-plugin for "index.html": 1 asset Entrypoint undefined = index.html [./node_modules/html-webpack-plugin/lib/loader.js!./index.html] 649 bytes {0} [built] [./node_modules/lodash/lodash.js] 527 KiB {0} [built] [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 489 bytes {0} [built] [./node_modules/webpack/buildin/module.js] (webpack)/buildin/module.js 497 bytes {0} [built] ℹ 「wdm」: Compiled successfully. - person diEcho; 03.07.2018
comment
Если вы везде используете __dirname, вам не нужен контекст ... или .html в разрешенных расширениях. Ответ против, потому что он был нарушен другими, тоже не имеет смысла. - person PlayMa256; 03.07.2018