Як я можу використовувати ES6 в webpack.config.js?


210

Як використовувати ES6 в webpack.config? Як це репо https://github.com/kriasoft/react-starter-kit робить?

Наприклад:

використовуючи це

import webpack from 'webpack';

замість

var webpack = require('webpack');

Це швидше цікавість, а не потреба.


@Аміти це питання. Я не можу це зрозуміти. Тому що якщо я використовую синтаксис es6 у webpack.config, я отримую помилки.
Візер

21
Питання в тому, як використовувати es6 в webpack.config.Здається мені зрозумілим. Оновлюю своє запитання прикладом.
Вішер

1
Файл аналізується node.js, який не підтримує es6 за замовчуванням. Є прапори командного рядка, щоб увімкнути це, але я не знаю, що вони є. Ви також можете спробувати використовувати io.js замість вузла
KJ Tsanaktsidis

@KJTsanaktsidis дякую за підказку, але я також намагався з --гармоніями без успіху
Whisher

Я цього не пробував, але спробуйте запустити "вузол - гармонія which webpack"
KJ Tsanaktsidis

Відповіді:


230

Спробуйте назвати конфігурацію як webpack.config.babel.js. У проект повинен бути включений реестр репортерів . Приклад на реакційному маршрутизаторі-завантажувальному пристрої .

Webpack спирається на Щоб зробити цю роботу, інтерпретацію внутрішньо.


4
Це працювало для мене. Я npm runцей скрипт: webpack --config webpack.config.babel.js.
Мат Гессел

9
Я думаю, що це могло б забрати безпосередньо навіть без цього --config.
Juho Vepsäläinen

4
Я думаю, слід додати, що babel-loaderмодуль також потрібен
фліпчарт

7
Насправді це працює чудово, просто потрібно встановити ваші попередньо встановлені у вашому файлі .babelrc.
пітер

10
Я використав цю специфічну echo '{ "presets": ["es2015"] }' > .babelrc
пресету,

39

Як альтернатива тому, що пропонує @bebraw, ви можете створити сценарій автоматизації JavaScript з синтаксисом ES6 +:

// tools/bundle.js

import webpack from 'webpack';
import webpackConfig from './webpack.config.js'; // <-- Contains ES6+

const bundler = webpack(webpackConfig);

bundler.run(...);

І виконайте це з вавілом:

$ babel-node tools/bundle

PS : Виклик веб-пакету через API API може бути кращим підходом (ніж його виклик через командний рядок), коли вам потрібно реалізувати більш складні кроки збирання. Наприклад, після того, як пакет готових до сервера буде готовий, запустіть сервер додатків Node.js і відразу після запуску сервера Node.js запустіть сервер розробки BrowserSync.

Дивитися також:


2
Хоча це і є трохи складним, саме для цього використовується реактивний набір. Це має бути найкращою відповіддю.
darkbaby123

20

Інший підхід полягає в НПМ скрипт на зразок цього: "webpack": "babel-node ./node_modules/webpack/bin/webpack"і запустити його в такий спосіб: npm run webpack.


Схоже, це не спрацьовує при передачі користувальницької конфігурації на babel-node ./node_modules/webpack/bin/webpack --config custom-webpack.config
веб-пакет

16

У мене виникла проблема із завантаженням рішення @ Juho із Webpack 2. Документи з міграції Webpack пропонують вам розібрати розбір модуля babel:

Важливо зазначити, що ви хочете сказати Babel не розбирати ці символи модуля, щоб веб-пакет міг їх використовувати. Це можна зробити, встановивши наступне у своїх .babelrc або опціях-завантажувачі.

.babelrc:

{
    "presets": [
         ["es2015", { "modules": false }]
    ]
}

На жаль, це вступає в конфлікт з функцією автоматичного реєстру діточок. Видалення

{ "modules": false }

з конфігурації babel знову почалися роботи. Однак це призведе до порушення тремтіння дерева, тому повне рішення передбачає перезапис попередніх налаштувань у параметрах завантажувача :

module: {
    rules: [
        {
            test: /\.js$/,
            include: path.resolve('src'),
            loader: 'babel-loader',
            options: {
                babelrc: false,
                presets: [['env', {modules: false}]]
            }
        }
    ]
}

Редагувати , 13 листопада 2017 р .; оновлений фрагмент конфігурації вебпакету до Webpack 3 (завдяки @ x-yuri). Старий, фрагмент Webpack 2:

{
    test: /\.js$/,
    exclude: ['node_modules'],
    loader: 'babel',
    query: {
        babelrc: false,
        presets: [
            ['es2015', { modules: false }],
        ],
    },
},

2
У наші дні (Webpack 3), мабуть, це виглядатиме так: module:{rules: [{test: /\.js$/, include: path.resolve('src'), loader: 'babel-loader', options: {babelrc: false, presets: [['env', {modules: false}]]}}]}( суть ). -loaderсуфікс більше не є обов'язковим. Намагайтеся уникати excludeі віддайте перевагу include. Рядки в включають / виключають роботу лише за абсолютних шляхів. queryбуло перейменовано на options.
x-yuri

Крім того , зробити це ясно , будь ласка , що ви не хочете {modules: false}в , .babelrcщоб мати можливість використовувати import«S в webpack.config.babel.js.
x-yuri

Для Webpack 4 -loaderпотрібно додати суфікс webpack.js.org/migrate/3/…
kmmbvnr

12

Це дуже просто, але мені не було очевидно жодної з відповідей, тому якщо хтось ще плутається, як я:

Просто додайте .babelчастину свого імені файлу перед розширенням (якщо вважати, що у вас єbabel-register встановили як залежність).

Приклад:

mv webpack.config.js webpack.config.babel.js

1
Я не використовую babel, оскільки сам webpack підтримує синтаксис модуля ES6, і мій проект не повинен бути сумісним з ES5. Це лише конфігураційний файл, який ще потрібен require. Це дивно, чи не так?
Кокодоко

Вау, це цікаво! Я цього не знав. Мені потрібно це переглянути. Дивно, що конфігураційний файл все-таки вимагає вимагати
Дмитро Мінковський

11

Це те, що працювало для мене за допомогою webpack 4:

В package.json:

"scripts": {
    "dev": "cross-env APP_ENV=dev webpack-serve --require @babel/register"
},

"devDependencies": {
    "@babel/core": "^7.0.0-rc.1",
    "@babel/register": "^7.0.0-rc.1",
    "@babel/preset-env": "^7.0.0-rc.1",
    "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2"
},

"babel": {
  "presets": [
    ["@babel/preset-env", {
      "targets": {
        "node": "current"
      }
    }]
  ],
  "plugins": [
    "transform-es2015-modules-commonjs"
  ]
}

Ви чітко бачите, як використовується кожна залежність, тому сюрпризів немає.

Примітка. Я використовую webpack-serve--quire , але якщо ви хочете використовувати webpackкоманду замість цього, замініть її на webpack --config-register. В будь-якому випадку @babel/registerпотрібно зробити цю роботу.

І це все!

yarn dev

І ви можете використовувати es6в конфігурації!


Для цього webpack-dev-serverвикористовуйте --config-registerпараметр, такий самий, як і для webpackкоманди


ПРИМІТКА:

НЕ потрібно перейменовувати конфігураційний файл webpack.config.babel.js(як це запропоновано прийнятою відповіддю). webpack.config.jsбуде працювати чудово.


Схоже, веб-сервіс застарілий. Будь-яке уявлення про те, як зробити цю роботу за допомогою webpack-dev-сервера? Я не бачу варіанту --quire
Crhistian Ramirez

1
@CrhistianRamirez, використовуй --config-registerопцію. Також репо для webpack-serveпереїзду сюди: github.com/shellscape/webpack-serve
smac89

1
Класно! що працювало на мене. Ось як виглядає мій сценарій: webpack --config-register @babel/register --config webpack/development.config.jsмені довелося конкретизувати --config, оскільки мій конфігурація веб-пакета знаходиться в папці. Дякую!
Крістіан Рамірес

6

Ще один спосіб - використовувати аргумент Requ для вузла:

node -r babel-register ./node_modules/webpack/bin/webpack

Знайдено таким чином у котлах , що реагують на електронні реакції , дивіться build-mainта build-rendererсценарії.


Видовищний - просто дивився на Electron і запускав окремий сервер, ваша відповідь допомогла чудово! :)
Метт

6

Конфігурація для Babel 7 та Webpack 4

package.json

    ...
    "scripts": {
        "start": "webpack-dev-server --env.dev",
        "build": "webpack --env.prod",
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "devDependencies": {
        "@babel/core": "^7.0.0",
        "@babel/plugin-proposal-class-properties": "^7.0.0",
        "@babel/preset-env": "^7.0.0",
        "@babel/preset-react": "^7.0.0",
        "@babel/register": "^7.0.0",
        "babel-loader": "^8.0.0",
        ...
        "webpack": "^4.17.2",
        "webpack-cli": "^3.1.0",
        "webpack-config-utils": "^2.3.1",
        "webpack-dev-server": "^3.1.8"

.babelrc

{
    "presets": ["@babel/preset-env", "@babel/preset-react"],
    "plugins": ["@babel/plugin-proposal-class-properties"]
}

webpack.config.babel.js

import webpack from 'webpack';
import { resolve } from 'path';

import { getIfUtils, removeEmpty } from 'webpack-config-utils';

export default env => {
    const { ifProd, ifNotProd } = getIfUtils(env);

    return {
        mode: ifProd('production', 'development'),
        devtool: ifNotProd('cheap-module-source-map'),
        output: {
            path: resolve(__dirname, ifProd('prod', 'dev')),
            filename: 'bundle.js'
        },

Це все ще не працює для мене, але IMHO виглядає як найсучасніший і майже найчистіший приклад (записи, пов’язані з властивостями класу, зайві для завдання, що знаходиться в руці).
сировина

4

Перейменувати webpack.config.jsна webpack.config.babel.js.

Потім у .babelrc: {"presets": ["es2015"]}

Однак якщо ви хочете використовувати інший конфігурацію babel для babel-cli, ваш .babelrc може виглядати приблизно так:

{
  "env": {
    "babel-cli": {
      "presets": [["es2015", {"modules": false}]]
    },
    "production": {
      "presets": ["es2015"]
    },
    "development": {
      "presets": ["es2015"]
    }
  }
}

І в package.json:

{
  "scripts": {
    "babel": "BABEL_ENV='babel-cli' babel src -d dist/babel --source-maps",
    "build-dev": "NODE_ENV='development' webpack -d --progress --profile --colors",
    ...
  },
  ...
}

Це {"modules": false}німо, але буде порушено веб-пакет, якщо ви не використовуєте різні програми.

Для отримання додаткової інформації про .babelrc, перегляньте офіційні документи .


4

Для TypeScript : прямо з https://webpack.js.org/configuration/configuration-languages/

npm install --save-dev typescript ts-node @types/node @types/webpack
# and, if using webpack-dev-server
npm install --save-dev @types/webpack-dev-server

потім продовжуйте писати свої, наприклад: webpack.config.ts

import path from 'path';
import webpack from 'webpack';

const config: webpack.Configuration = {
  mode: 'production',
  entry: './foo.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'foo.bundle.js'
  }
};

export default config;

Перегляньте посилання, щоб отримати докладніші відомості, де ви можете використовувати плагін, щоб мати окремий файл tsconfig лише для конфігурації веб-пакету, якщо ви не орієнтуєтеся на commonjs (який для цього працює, оскільки він покладається на ts-вузол).


Дякую за це, не вдалося отримати модулі, які працюють для webpack.config.js, але із задоволенням використовую TypeScript замість цього.
Пол Уотсон

3

Не вистачає респондентів для коментарів, але я хотів додати для будь-яких користувачів TypeScript подібне рішення до @Sandrik вище

У мене є два сценарії, які я вказую на конфігурації веб-упаковки (файли JS), які містять синтаксис ES6.

"start-dev": "./node_modules/.bin/ts-node ./node_modules/webpack-dev-server/bin/webpack-dev-server.js --config ./webpack/webpack.config.dev.js"

і

"build": "./node_modules/.bin/ts-node ./node_modules/webpack/bin/webpack.js --config webpack/webpack.config.js"


2

Мій найкращий підхід разом із npm-скриптом

node -r babel-register ./node_modules/webpack/bin/webpack

і налаштувати решту сценаріїв відповідно до вашої вимоги до Babel


2

Після тонни документів ...

  1. Просто встановіть програму es2015 (не env !!!) та додайте її до

    .babelrc:
    {
        "presets": [
             ["es2015", { "modules": false }]
        ]
    }
    
  2. перейменуйте webpack.config.jsTowebpack.config.babel.js


2

Використання Webpack 4 та Babel 7

Щоб налаштувати файл конфігурації веб-пакету для використання ES2015, потрібно Babel:

Встановити залежність розробників:

npm i -D  webpack \
          webpack-cli \
          webpack-dev-server \
          @babel/core \
          @babel/register \
          @babel/preset-env
npm i -D  html-webpack-plugin

Створіть .babelrcфайл:

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

Створіть конфігурацію веб-пакету webpack.config.babel.js:

import { resolve as _resolve } from 'path';
import HtmlWebpackPlugin from 'html-webpack-plugin';

const config = {
  mode: 'development',
  devServer: {
    contentBase: './dist'
  },
  plugins: [
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'src/index.html'
    })
  ],
  resolve: {
    modules: [_resolve(__dirname, './src'), 'node_modules']
  }
};

export default config;

Створіть свої сценарії в package.json:

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack",
    "start": "webpack-dev-server --open"
  },

Виконати npm run buildі npm start.

Конфігурація веб-пакету базується на прикладі проекту із такою структурою каталогу:

├── README.md
├── package-lock.json
├── package.json
├── src
   ├── Greeter.js
   ├── index.html
   └── index.js
└── webpack.config.babel.js

Зразок проекту: Мова конфігурації веб-пакету за допомогою Babel


2

Додавання es6 до webpack - це триетапний процес

  1. В webpack.config.js додати

    module:{
    
              rules:[
                {
                  test: /\.js$/,
                  loader: 'babel-loader'
                }
              ]
           }
    
    1. Створіть .babel.rc і додайте всередину нього
{
    "presets": ["@babel/env", "@babel/react"],
    "plugins": [
        [
          "@babel/plugin-proposal-class-properties",
        ]
      ]
}
  1. в пакет.json додати
npm install @babel/core --save-dev
npm install @babel/preset-env --save-dev
npm install @babel/preset-react --save-dev
npm install @babel/plugin-proposal-class-properties --save-dev
npm install babel-loader --save-dev

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.