¿Cómo puedo usar ES6 en webpack.config.js?


210

¿Cómo usar ES6 en webpack.config? Me gusta este repositorio https://github.com/kriasoft/react-starter-kit ?

Por ejemplo:

usando esto

import webpack from 'webpack';

en vez de

var webpack = require('webpack');

Es una curiosidad más que una necesidad.


@Amitir es una pregunta. No puedo resolverlo. Porque si uso la sintaxis es6 en webpack.config obtengo errores.
Whisher

21
La pregunta es cómo usar es6 en webpack.config. Me parece claro. Actualizo mi pregunta con un ejemplo.
Whisher

1
El archivo es analizado por node.js, que no admite es6 de forma predeterminada. Hay banderas de línea de comando para activar esto, pero no sé cuáles son. También puede intentar usar io.js en lugar de nodo
KJ Tsanaktsidis

@KJTsanaktsidis gracias por la pista, pero también he intentado con --armonía sin éxito
Whisher

No he intentado esto, pero intente ejecutar "node --harmony which webpack"
KJ Tsanaktsidis

Respuestas:


230

Intenta nombrar tu configuración como webpack.config.babel.js. Debería tener babel-register incluido en el proyecto. Ejemplo en react-router-bootstrap .

Webpack se basa en la interpretación interna para que esto funcione.


44
Esto funcionó para mí. Yo npm runeste guión: webpack --config webpack.config.babel.js.
Mat Gessel

9
Creo que podría recogerlo directamente incluso sin él --config.
Juho Vepsäläinen

44
Creo que debería agregarse que babel-loadertambién se requiere el módulo
rotafolio

77
En realidad, funciona bien, solo necesita configurar sus presets de babel en un archivo .babelrc.
Peter

10
echo '{ "presets": ["es2015"] }' > .babelrc
Usé

39

Como alternativa a lo que sugiere @bebraw, puede crear un script de automatización de JavaScript con sintaxis ES6 +:

// tools/bundle.js

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

const bundler = webpack(webpackConfig);

bundler.run(...);

Y ejecutarlo con babel:

$ babel-node tools/bundle

PD : Llamar a webpack a través de la API de JavaScript podría ser un mejor enfoque (que llamarlo a través de una línea de comando) cuando necesita implementar pasos de compilación más complejos. Por ejemplo, después de que el paquete del lado del servidor esté listo, inicie el servidor de aplicaciones Node.js, y justo después de que se inicie el servidor Node.js, inicie el servidor de desarrollo BrowserSync.

Ver también:


2
Aunque es un poco complejo, esto es exactamente lo que utiliza el kit de inicio de reacción. Debería ser la mejor respuesta.
darkbaby123

20

Otro enfoque es tener un guión NPM como esta: "webpack": "babel-node ./node_modules/webpack/bin/webpack"y ejecutarlo así: npm run webpack.


Esto no parece funcionar al pasar una configuración personalizada al paquete web babel-node ./node_modules/webpack/bin/webpack --config custom-webpack.config
Abhinav Singi

16

Tuve un problema al ejecutar la solución de @ Juho con Webpack 2. Los documentos de migración de Webpack sugieren que desactive el análisis del módulo babel:

Es importante tener en cuenta que querrá decirle a Babel que no analice estos símbolos de módulo para que webpack pueda usarlos. Puede hacerlo configurando lo siguiente en sus opciones .babelrc o babel-loader.

.babelrc:

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

Lamentablemente, esto entra en conflicto con la funcionalidad de registro automático de babel. Quitando

{ "modules": false }

desde la configuración de babel, las cosas volvieron a funcionar Sin embargo, esto daría como resultado la sacudida del árbol, por lo que una solución completa implicaría sobrescribir los ajustes preestablecidos en las opciones del cargador :

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

Edición , 13 de noviembre de 2017; fragmento de configuración de webpack actualizado a Webpack 3 (gracias a @ x-yuri). Viejo fragmento de Webpack 2:

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

2
En estos días (Webpack 3), probablemente se vería así: module:{rules: [{test: /\.js$/, include: path.resolve('src'), loader: 'babel-loader', options: {babelrc: false, presets: [['env', {modules: false}]]}}]}( esencia ). -loadersufijo ya no es opcional. Intenta evitar excludey preferir include. Las cadenas en incluir / excluir trabajo solo si son rutas absolutas. queryfue renombrado a options.
x-yuri

También, por favor, que quede claro que no desea {modules: false}en .babelrcser capaz de usar import's en webpack.config.babel.js.
x-yuri

Para Webpack 4, el -loadersufijo debe agregarse nuevamente webpack.js.org/migrate/3/…
kmmbvnr

12

Esto es realmente fácil, pero no fue obvio para mí por ninguna de las respuestas, así que si alguien más está confundido como yo:

Simplemente agregue .babella parte de su nombre de archivo antes de la extensión (suponiendo que tengababel-register instalado como una dependencia).

Ejemplo:

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

1
No uso babel porque el paquete web ya es compatible con la sintaxis del módulo ES6, y mi proyecto no necesita ser compatible con ES5. Es solo el archivo de configuración que todavía necesita require. Eso es raro, ¿no?
Kokodoko

Woah que interesante! No lo sabia. Necesitaré volver a visitar esto. Extraño que el archivo de configuración aún requiera requerir
Dmitry Minkovsky

11

Esto es lo que funcionó para mí usando webpack 4:

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

Puede ver claramente cómo se usa cada dependencia, por lo que no hay sorpresas allí.

Tenga en cuenta que estoy usando webpack-serve--require , pero si desea usar el webpackcomando en su lugar, reemplácelo con webpack --config-register. En cualquier caso, @babel/registeres necesario para que esto funcione.

¡Y eso es!

yarn dev

¡Y puedes usarlo es6en la configuración!


Para webpack-dev-server, use la --config-registeropción que es la misma que con el webpackcomando


NOTA:

NO es necesario cambiar el nombre del archivo de configuración a webpack.config.babel.js(como lo sugiere la respuesta aceptada). webpack.config.jsfuncionará bien.


Parece que el servicio web está en desuso. ¿Alguna idea de cómo hacer que esto funcione con webpack-dev-server? No veo una opción --require para ello en los documentos: webpack.js.org/configuration/dev-server/#devserver
Crhistian Ramirez

1
@CrhistianRamirez, usa la --config-registeropción. También el repositorio para webpack-servemudado aquí: github.com/shellscape/webpack-serve
smac89

1
¡Frio! Eso funcionó para mí. Así es como se ve mi script: webpack --config-register @babel/register --config webpack/development.config.jstuve que especificar --config porque mi configuración de paquete web está en una carpeta. ¡Gracias!
Crhistian Ramirez

6

Una forma más es usar el argumento require para el nodo:

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

Encontrado de esta manera en electron-react-boilerplate , mira build-mainy build-rendererscripts.


Espectacular: solo estaba mirando Electron e iniciando un servidor separado, ¡su respuesta ayudó perfectamente! :)
Matt

6

Configuración para Babel 7 y 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'
        },

Esto todavía no funciona para mí, pero en mi humilde opinión parece ser el ejemplo más actualizado y casi más limpio (las entradas relacionadas con las propiedades de clase son superfluas para la tarea en cuestión).
rawpower

4

Renombrar webpack.config.jsawebpack.config.babel.js .

Luego en .babelrc: {"presets": ["es2015"]}

Sin embargo, si desea utilizar una configuración de babel diferente para babel-cli, su .babelrc podría verse así:

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

Y en 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",
    ...
  },
  ...
}

Es tonto pero el {"modules": false} romperá el paquete web si no usa diferentes envs.

Para obtener más información sobre .babelrc, consulte los documentos oficiales .


4

Para TypeScript : directamente desde 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

luego proceda a escribir su, por ejemplo: 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;

Consulte el enlace para obtener más detalles donde puede usar un complemento para tener un archivo tsconfig separado solo para la configuración del paquete web si no está apuntando a commonjs (que es un requisito para que esto funcione ya que se basa en el nodo ts).


Gracias por esto, no pude hacer que los módulos funcionen para webpack.config.js, pero estoy feliz de usar TypeScript en su lugar, lo que funciona.
Paul Watson

3

No tengo suficiente representante para comentar, pero quería agregar para cualquier usuario de TypeScript una solución similar a @Sandrik arriba

Tengo dos scripts que utilizo apuntando a configuraciones de paquete web (archivos JS) que contienen la sintaxis ES6.

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

y

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


2

Mi mejor enfoque junto con el script npm es

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

y configure el resto de los scripts según sus requisitos para Babel


2

Después de toneladas de los documentos ...

  1. Simplemente instale el preestablecido es2015 (no env !!!) y agréguelo a

    .babelrc:
    {
        "presets": [
             ["es2015", { "modules": false }]
        ]
    }
    
  2. Renombra tu webpack.config.jsawebpack.config.babel.js


2

Usando Webpack 4 y Babel 7

Para configurar un archivo de configuración de paquete web para usar ES2015 requiere Babel:

Instalar dependencias de desarrollo:

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

Crea un .babelrcarchivo:

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

Cree su configuración de paquete web 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;

Crea tus scripts en package.json:

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

Corre npm run buildy npm start.

La configuración del paquete web se basa en un proyecto de muestra con la siguiente estructura de directorios:

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

Proyecto de muestra: Lenguaje de configuración de paquete web con Babel


2

Agregar es6 a webpack es un proceso de 3 pasos

  1. En webpack.config.js agregue

    module:{
    
              rules:[
                {
                  test: /\.js$/,
                  loader: 'babel-loader'
                }
              ]
           }
    
    1. Cree un .babel.rc y agréguelo dentro
{
    "presets": ["@babel/env", "@babel/react"],
    "plugins": [
        [
          "@babel/plugin-proposal-class-properties",
        ]
      ]
}
  1. en package.json agregar
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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.