Làm cách nào tôi có thể sử dụng ES6 trong webpack.config.js?


210

Làm cách nào để sử dụng ES6 trong webpack.config? Thích repo này https://github.com/kriasoft/react-starter-kit nào?

Ví dụ:

Sử dụng cái này

import webpack from 'webpack';

thay vì

var webpack = require('webpack');

Đó là một sự tò mò hơn là một nhu cầu.


@ Hãy thừa nhận đó là một câu hỏi. Tôi không thể tìm ra nó. Bởi vì nếu tôi sử dụng cú pháp es6 trong webpack.config tôi sẽ gặp lỗi.
Whower

21
Câu hỏi là làm thế nào để sử dụng es6 trong webpack.config. Nó có vẻ rõ ràng đối với tôi. Tôi cập nhật câu hỏi của tôi với một ví dụ.
Whower

1
Tệp được phân tích cú pháp bởi node.js, không hỗ trợ es6 theo mặc định. Có các cờ dòng lệnh để bật cái này lên, nhưng tôi không biết chúng là gì. Bạn cũng có thể thử sử dụng io.js thay vì nút
KJ Tsanaktsidis

@KJTsanaktsidis cảm ơn vì gợi ý nhưng tôi cũng đã thử với --harmony không thành công
Whower

Tôi chưa thử cái này, nhưng hãy thử chạy "node --harmony which webpack"
KJ Tsanaktsidis

Câu trả lời:


230

Hãy thử đặt tên cấu hình của bạn là webpack.config.babel.js. Bạn nên có đăng ký babel trong dự án. Ví dụ tại Reac-router-bootstrap .

Webpack dựa vào diễn giải nội bộ để thực hiện công việc này.


4
Điều này làm việc cho tôi. Tôi npm runkịch bản này : webpack --config webpack.config.babel.js.
Mat G Tàu

9
Tôi nghĩ rằng nó có thể có thể nhận nó trực tiếp ngay cả khi không có --config.
Juho Vepsäläinen

4
Tôi nghĩ rằng cần phải thêm rằng babel-loadermô-đun cũng được yêu cầu
flipchart

7
Trên thực tế, nó hoạt động tốt, chỉ cần đặt các cài đặt trước babel của bạn trong một tệp .babelrc.
peter

10
Tôi đã sử dụng cài đặt trước cụ thể này để làm cho nó hoạt động:echo '{ "presets": ["es2015"] }' > .babelrc
killthrush

39

Thay thế cho những gì @bebraw gợi ý, bạn có thể tạo tập lệnh tự động hóa JavaScript với cú pháp ES6 +:

// tools/bundle.js

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

const bundler = webpack(webpackConfig);

bundler.run(...);

Và thực hiện nó với babel:

$ babel-node tools/bundle

PS : Gọi gói web qua API JavaScript có thể là một cách tiếp cận tốt hơn (bằng cách gọi nó qua một dòng lệnh) khi bạn cần thực hiện các bước xây dựng phức tạp hơn. Ví dụ: sau khi gói phía máy chủ đã sẵn sàng, khởi động máy chủ ứng dụng Node.js và ngay sau khi máy chủ Node.js được khởi động, hãy khởi chạy máy chủ dev của BrowserSync.

Xem thêm:


2
Mặc dù hơi phức tạp, đây chính xác là những gì mà bộ phản ứng khởi động sử dụng. Nó nên là câu trả lời tốt nhất.
darkbaby123

20

Một cách tiếp cận khác là có một kịch bản npm như thế này : "webpack": "babel-node ./node_modules/webpack/bin/webpack", và chạy nó như vậy : npm run webpack.


Điều này dường như không hoạt động khi chuyển một cấu hình tùy chỉnh vào webpack babel-node ./node_modules/webpack/bin/webpack --config custom-webpack.config
Abhinav Singi

16

Tôi gặp sự cố khi giải pháp của @ Juho chạy với Webpack 2. Các tài liệu di chuyển Webpack đề nghị bạn chuyển phân tích mô-đun babel:

Điều quan trọng cần lưu ý là bạn sẽ muốn nói với Babel không phân tích các ký hiệu mô-đun này để webpack có thể sử dụng chúng. Bạn có thể làm điều này bằng cách đặt các tùy chọn sau trong các tùy chọn .babelrc hoặc babel-loader của bạn.

.babelrc:

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

Đáng buồn thay, điều này mâu thuẫn với chức năng đăng ký babel tự động. Đang gỡ bỏ

{ "modules": false }

từ cấu hình babel có những thứ chạy lại. Tuy nhiên, điều này sẽ dẫn đến phá vỡ rung cây, do đó, một giải pháp hoàn chỉnh sẽ liên quan đến việc ghi đè lên các cài đặt trước trong các tùy chọn trình tải :

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

Chỉnh sửa , ngày 13 tháng 11 năm 2017; cập nhật đoạn mã cấu hình webpack lên Webpack 3 (nhờ @ x-yuri). Cũ, Webpack 2 đoạn:

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

2
Ngày nay (Webpack 3), nó có thể sẽ trông như thế này: module:{rules: [{test: /\.js$/, include: path.resolve('src'), loader: 'babel-loader', options: {babelrc: false, presets: [['env', {modules: false}]]}}]}( ý chính ). -loaderhậu tố không còn tùy chọn. Cố gắng tránh excludevà thích include. Chuỗi bao gồm / loại trừ công việc chỉ khi đường dẫn tuyệt đối. queryđã được đổi tên thành options.
x-yuri

Ngoài ra, làm cho nó rõ ràng xin vui lòng bạn không muốn {modules: false}trong .babelrcđể có thể sử dụng import's trong webpack.config.babel.js.
x-yuri

Đối với Webpack 4 -loaderhậu tố cần phải được bổ sung trở lại webpack.js.org/migrate/3/...
kmmbvnr

12

Điều này thực sự dễ dàng, nhưng tôi không rõ ràng trong bất kỳ câu trả lời nào, vì vậy nếu có ai khác nhầm lẫn như tôi:

Chỉ cần thêm .babelvào phần tên tệp của bạn trước phần mở rộng (giả sử rằng bạn đã babel-registercài đặt như một phần phụ thuộc).

Thí dụ:

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

1
Tôi không sử dụng babel vì bản thân gói web đã hỗ trợ cú pháp mô-đun ES6 và dự án của tôi không cần phải tương thích với ES5. Nó chỉ là tập tin cấu hình vẫn cần require. Điều đó thật lạ phải không?
Kokodoko

Woah thật thú vị! Tôi không biết điều đó. Tôi sẽ cần phải xem lại điều này. Điều kỳ lạ là tập tin cấu hình vẫn yêu cầu
Dmitry Minkovsky

11

Đây là những gì làm việc cho tôi bằng cách sử dụng webpack 4:

Trong 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"
  ]
}

Bạn có thể thấy rõ từng phụ thuộc được sử dụng như thế nào, vì vậy không có gì ngạc nhiên ở đó.

Lưu ý tôi đang sử dụng webpack-serve--require , nhưng nếu bạn muốn sử dụng webpacklệnh thay thế, hãy thay thế nó bằng webpack --config-register. Trong cả hai trường hợp,@babel/register là cần thiết để làm cho công việc này.

Và đó là nó!

yarn dev

Và bạn có thể sử dụng es6trong cấu hình!


Đối với webpack-dev-server, sử dụng --config-registertùy chọn giống như với webpacklệnh


GHI CHÚ:

KHÔNG cần đổi tên tập tin cấu hình thành webpack.config.babel.js(như được đề xuất bởi câu trả lời được chấp nhận). webpack.config.jssẽ làm việc tốt


Có vẻ như phục vụ web bị phản đối. Bất kỳ ý tưởng về cách làm cho điều này làm việc với webpack-dev-server? Tôi không thấy tùy chọn --require cho nó trong các tài liệu: webpack.js.org/configuration/dev-server/#devserver
Ramirez

1
@CrhistianRamirez, sử dụng --config-registertùy chọn. Ngoài ra repo để webpack-servechuyển đến đây: github.com/shellscape/webpack-serve
smac89

1
Mát mẻ! Điều đó đã làm việc cho tôi. Đây là kịch bản của tôi trông như thế nào: webpack --config-register @babel/register --config webpack/development.config.jsTôi phải đặc biệt --config vì cấu hình webpack của tôi nằm trong một thư mục. Cảm ơn bạn!
Crhistian Ramirez

6

Một cách nữa là sử dụng đối số yêu cầu cho nút:

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

Tìm thấy cách này trong phản ứng điện tử-nồi hơi , nhìn vào build-mainbuild-renderercác kịch bản.


Spectacular - chỉ cần nhìn vào Electron và khởi động một máy chủ riêng biệt, câu trả lời của bạn đã giúp một cách hoàn hảo! :)
Matt

6

Cấu hình cho Babel 7 & Webpack 4

pack.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'
        },

Điều này vẫn không hiệu quả với tôi, nhưng IMHO có vẻ là ví dụ cập nhật nhất và gần như sạch nhất (các mục liên quan đến thuộc tính lớp là không cần thiết cho nhiệm vụ trong tay).
rawpower

4

Đổi tên webpack.config.jsthành webpack.config.babel.js.

Sau đó, trong .babelrc: {"presets": ["es2015"]}

Tuy nhiên, nếu bạn muốn sử dụng một cấu hình babel khác cho babel-cli, .babelrc của bạn có thể trông giống như thế này:

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

Và trong gói.json:

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

Thật ngu ngốc nhưng {"modules": false}sẽ phá vỡ gói webpack nếu bạn không sử dụng các env khác nhau.

Để biết thêm thông tin về .babelrc, hãy kiểm tra các tài liệu chính thức .


4

Đối với TypeScript : trực tiếp từ https://webpack.js.org/configuration/configuration-lacular/

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

sau đó tiến hành viết, ví dụ: 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;

Kiểm tra liên kết để biết thêm chi tiết nơi bạn có thể sử dụng plugin để có tệp tsconfig riêng cho cấu hình webpack nếu bạn không nhắm mục tiêu chungjs (đây là một req để điều này hoạt động vì nó phụ thuộc vào nút ts).


Cảm ơn vì điều này, không thể có các mô-đun làm việc cho webpack.config.js nhưng rất vui khi sử dụng TypeScript thay vì nó hoạt động.
Paul Watson

3

Không có đủ đại diện để bình luận, nhưng tôi muốn thêm cho bất kỳ người dùng TypeScript nào ngoài đó có một giải pháp tương tự với @Sandrik ở trên

Tôi có hai tập lệnh mà tôi sử dụng trỏ đến cấu hình webpack (tệp JS) có chứa cú pháp 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

Cách tiếp cận tốt nhất của tôi cùng với kịch bản npm là

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

và cấu hình phần còn lại của tập lệnh theo yêu cầu của bạn cho Babel


2

Sau hàng tấn tài liệu ...

  1. Chỉ cần cài đặt sẵn es2015 (không phải env !!!) và thêm nó vào

    .babelrc:
    {
        "presets": [
             ["es2015", { "modules": false }]
        ]
    }
    
  2. Đổi tên webpack.config.jsthànhwebpack.config.babel.js


2

Sử dụng Webpack 4 và Babel 7

Để thiết lập tệp cấu hình webpack để sử dụng ES2015 cần có Babel:

Cài đặt phụ thuộc dev:

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

Tạo một .babelrctệp:

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

Tạo cấu hình webpack của bạn , 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;

Tạo tập lệnh của bạn trong package.json:

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

Chạy npm run buildnpm start.

Cấu hình webpack dựa trên một dự án mẫu với cấu trúc thư mục sau:

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

Dự án mẫu: Ngôn ngữ cấu hình Webpack bằng Babel


2

Thêm es6 vào webpack là một quá trình 3 bước

  1. Trong webpack.config.js thêm

    module:{
    
              rules:[
                {
                  test: /\.js$/,
                  loader: 'babel-loader'
                }
              ]
           }
    
    1. Tạo một .babel.rc và thêm vào bên trong nó
{
    "presets": ["@babel/env", "@babel/react"],
    "plugins": [
        [
          "@babel/plugin-proposal-class-properties",
        ]
      ]
}
  1. trong gói.json thêm
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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.