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

时间:2015-08-09 11:23:01

标签: webpack

如何在webpack.config中使用ES6? 像这个回购 https://github.com/kriasoft/react-starter-kit 呢?

例如:

使用此

import webpack from 'webpack';

而不是

var webpack = require('webpack');

这是一种好奇而非需要。

16 个答案:

答案 0 :(得分:210)

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

Webpack在内部依赖interpret来完成这项工作。

答案 1 :(得分:36)

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

=TODAY()

用babel执行它:

// tools/bundle.js

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

const bundler = webpack(webpackConfig);

bundler.run(...);

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

另见:

答案 2 :(得分:18)

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

答案 3 :(得分:15)

我在使用Webpack 2运行@Juho的解决方案时遇到了问题。Webpack migration docs建议你转向babel模块解析:

  

请注意,您需要告诉Babel不要解析   这些模块符号因此webpack可以使用它们。你可以这样做   在.babelrc或babel-loader选项中设置以下内容。

     

.babelrc:

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

可悲的是,这与自动babel注册功能相冲突。删除

{ "modules": false }
来自babel配置的

让事情再次运行。但是,这会导致破坏树木,因此完整的解决方案将涉及overwriting the presets in the loader options

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 }],
        ],
    },
},

答案 4 :(得分:11)

这很简单,但对于我来说,任何答案都不是很明显,所以如果有其他人像我一样感到困惑:

只需在扩展名之前将.babel附加到文件名部分(假设您已将babel-register作为依赖项安装)。

示例:

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

答案 5 :(得分:6)

这是使用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-register选项,该选项与webpack命令相同


注意:

无需将配置文件重命名为webpack.config.babel.js(如已接受的答案所建议)。 webpack.config.js可以正常工作。

答案 6 :(得分:5)

另一种方法是对节点使用require参数:

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

electron-react-boilerplate中找到这种方式,查看build-mainbuild-renderer脚本。

答案 7 :(得分:4)

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

答案 8 :(得分:3)

webpack.config.js重命名为webpack.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}会打破网络包。

有关.babelrc的更多信息,请查看official docs

答案 9 :(得分:1)

我最好的方法和npm脚本是

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

根据您对Babel

的要求配置其余脚本

答案 10 :(得分:1)

没有足够的代表评论,但我想为任何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"

答案 11 :(得分:1)

大量文件之后...

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

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

答案 12 :(得分:1)

将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

答案 13 :(得分:0)

对于 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,则可以在其中使用插件为Webpack配置使用单独的tsconfig文件(由于它依赖于ts-node,因此这是一项工作要求)

答案 14 :(得分:0)

使用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

示例项目:Webpack Configuration Language Using Babel

答案 15 :(得分:0)

不能。您必须使用babelesm将其转换为CommonJS。

https://github.com/webpack/webpack-cli/issues/282

但是您可以运行webpack -r esm @babel/register