如何在webpack.config.js中使用ES6?


210

如何在webpack.config中使用ES6?像这个仓库 https://github.com/kriasoft/react-starter-kit 可以吗?

例如:

使用这个

import webpack from 'webpack';

代替

var webpack = require('webpack');

这是一种好奇而不是需要。


@Amit这是一个问题。我不知道。因为如果在webpack.config中使用es6语法,则会出现错误。
Whisher

21
问题是如何在webpack.config中使用es6,对我来说似乎很清楚。
Whisher

1
该文件由node.js解析,默认情况下不支持es6。有命令行标志可以将其打开,但是我不知道它们是什么。您也可以尝试使用io.js而不是节点
KJ Tsanaktsidis

@KJTsanaktsidis感谢您的提示,但我也尝试过
--harmony

我没有尝试过,但是尝试运行“ node which webpack
--harmony

Answers:


230

尝试将您的配置命名为webpack.config.babel.js。您应该在项目中包含babel-register。在react-router-bootstrap的示例。

Webpack依靠内部解释来完成这项工作。


4
这对我有用。我npm run此脚本:webpack --config webpack.config.babel.js
Mat Gessel

9
我认为即使没有,它也可以直接将其捡起--config
JuhoVepsäläinen15年

4
我认为应该补充一点,该babel-loader模块也是必需的
活动挂图

7
实际上,它工作正常,只需要在.babelrc文件中设置babel预设即可。
彼得2016年

10
我使用了这个特定的预设来使其工作:echo '{ "presets": ["es2015"] }' > .babelrc
killthrush,2016年

39

作为@bebraw建议的替代方案,您可以使用ES6 +语法创建JavaScript自动化脚本:

// tools/bundle.js

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

const bundler = webpack(webpackConfig);

bundler.run(...);

并使用babel执行它:

$ babel-node tools/bundle

PS:当您需要实施更复杂的构建步骤时,通过JavaScript API调用webpack可能是一种更好的方法(比通过命令行调用webpack更好)。例如,在服务器端捆绑包准备就绪后,启动Node.js应用服务器,并在Node.js服务器启动后立即启动BrowserSync开发服务器。

也可以看看:


2
尽管有点复杂,但这正是react-starter-kit所使用的。这应该是最好的答案。
darkbaby123

20

另一种方法是使用npm脚本,如:"webpack": "babel-node ./node_modules/webpack/bin/webpack",然后像这样运行:npm run webpack


将自定义配置传递到webpack时,这似乎不起作用 babel-node ./node_modules/webpack/bin/webpack --config custom-webpack.config
Abhinav Singi

16

我在让@Juho的解决方案与Webpack 2 一起运行时遇到问题。Webpack迁移文档建议您进行babel模块解析:

重要的是要注意,您将要告诉Babel不要解析这些模块符号,以便Webpack可以使用它们。您可以通过在.babelrc或babel-loader选项中设置以下内容来执行此操作。

.babelrc:

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

令人遗憾的是,这与自动Babel寄存器功能冲突。拆下

{ "modules": false }

通过babel config重新运行。但是,这将导致摇树,因此一个完整的解决方案将涉及覆盖loader选项中的预设

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

编辑,2017年11月13日; 将webpack配置片段更新为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}]]}}]}gist)。-loader后缀不再是可选的。尽量避免exclude和喜欢include。字符串中包含/排除的工作只有在绝对路径。query已重命名为options
x-yuri

此外,还要清楚,请你不要{modules: false}.babelrc能够使用import的中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。是不是很奇怪?
Kokodoko

哇,真有趣!我不知道 我需要重温一下。仍然需要配置文件的怪异要求
Dmitry Minkovsky

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--require,但是如果您想使用该webpack命令,请将其替换为webpack --config-register。无论哪种情况,@babel/register都需要进行这项工作。

就是这样!

yarn dev

而且您可以es6在配置中使用!


对于webpack-dev-server,请使用--config-registerwebpack命令相同的选项


注意:

无需将配置文件重命名为webpack.config.babel.js(如已接受的答案所建议)。webpack.config.js会很好。


似乎已弃用网络服务。关于如何使它与webpack-dev-server一起工作的任何想法吗?我在文档中没有看到--require选项:webpack.js.org/configuration/dev-server/#devserver
Crhistian Ramirez,

1
@CrhistianRamirez,使用该--config-register选项。还要webpack-serve移至以下位置的
仓库

1
凉!对我有用。这是我的脚本的样子:webpack --config-register @babel/register --config webpack/development.config.js我必须专门--config,因为我的webpack配置位于文件夹中。谢谢!
克里斯蒂安·拉米雷斯


6

Babel 7Webpack 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'
        },

对于我来说,这仍然不起作用,但是恕我直言,这似乎是最新和几乎最干净的示例(与类属性相关的条目对于手头的任务是多余的)。
rawpower

4

重命名webpack.config.jswebpack.config.babel.js

然后在.babelrc中: {"presets": ["es2015"]}

但是,如果要对babel-cli使用其他babel配置,则.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}如果您不使用其他环境,将会破坏webpack。

有关.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;

检查链接以获取更多详细信息,如果您不针对commonjs(可以依靠ts-node的话,可以使用此插件,仅针对webpack配置使用单独的tsconfig文件),则可在其中使用单独的tsconfig文件。


感谢这样做,无法使模块适用于webpack.config.js,但很高兴使用TypeScript起作用了。
Paul Watson

3

没有足够的代表评论,但我想为所有TypeScript用户添加与上面的@Sandrik类似的解决方案

我有两个脚本用于指向包含ES6语法的webpack配置(JS文件)。

"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

大量文件之后...

  1. 只需安装es2015预设(不是env !!!)并将其添加到

    .babelrc:
    {
        "presets": [
             ["es2015", { "modules": false }]
        ]
    }
    
  2. 重命名webpack.config.jswebpack.config.babel.js


2

使用Webpack 4和Babel 7

要设置webpack配置文件以使用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配置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 buildnpm start

webpack配置基于具有以下目录结构的示例项目:

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

示例项目:使用Babel的Webpack配置语言


2

将ES6添加到Webpack的过程分为3个步骤

  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. package.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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.