"Es posible que necesite un cargador adecuado para manejar este tipo de archivo" con Webpack y Babel

106

Estoy intentando usar Webpack con Babel para compilar activos de ES6, pero recibo el siguiente mensaje de error:

You may need an appropriate loader to handle this file type.
| import React from 'react';
| /*
| import { render } from 'react-dom'

Así es como se ve mi configuración de Webpack:

var path = require('path');
var webpack = require('webpack');

module.exports = {
  entry: './index',
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js',
    publicPath: '/dist/'
  },
  module: {
    loaders: [
      {
        test: /\.jsx?$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      }
    ]
  }
}

Aquí está el paso del middleware que utiliza Webpack:

var webpack = require('webpack');
var webpackDevMiddleware = require('webpack-dev-middleware');
var config = require('./webpack.config');

var express = require('express');
var app = express();
var port = 3000;

var compiler = webpack(config);
app.use(webpackDevMiddleware(compiler, {
  noInfo: true,
  publicPath: config.output.publicPath
}));

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/index.html');
});

app.listen(port, function(err) {
  console.log('Server started on http://localhost:%s', port);
});

Todo lo que hace mi archivo index.js es importar react, pero parece que el 'babel-loader' no funciona.

Estoy usando 'babel-loader' 6.0.0.

egidra
fuente
1
Estoy teniendo el mismo problema. babel-preset-es2015 está instalado y, sin embargo, todavía tiene problemas con el uso de JSX en una llamada ReactDOM.render (): s
SomethingOn
¿Cuáles son las extensiones de su archivo? ¿Son archivos js o archivos jsx? Su cargador solo considera archivos con extensiones jsx, ese podría ser el problema
cubbuk
En este enlace, su problema se resolverá al 100% [ stackoverflow.com/questions/50149729/…
Mehrdad Masoumi
En este enlace, su problema se resolverá al 100%. Importar css a next.js
Mehrdad Masoumi

Respuestas:

86

Necesita instalar el es2015ajuste preestablecido:

npm install babel-preset-es2015

y luego configurar babel-loader:

{
    test: /\.jsx?$/,
    loader: 'babel-loader',
    exclude: /node_modules/,
    query: {
        presets: ['es2015']
    }
}
loganfsmyth
fuente
37
Tengo preconfiguraciones instaladas y babel-loader también. Sigue dando el mismo error
Umang Gupta
@UG_ Tendrás que hacer una pregunta aparte. Necesitaríamos ver su configuración completa y el mensaje de error completo.
loganfsmyth
1
@UG_ ¿encontraste la solución?
Sarasranglt
34

Asegúrese de tener instalado el ajuste preestablecido de babel es2015 .

Un ejemplo de package.json devDependencies es:

"devDependencies": {
  "babel-core": "^6.0.20",
  "babel-loader": "^6.0.1",
  "babel-preset-es2015": "^6.0.15",
  "babel-preset-react": "^6.0.15",
  "babel-preset-stage-0": "^6.0.15",
  "webpack": "^1.9.6",
  "webpack-dev-middleware": "^1.2.0",
  "webpack-hot-middleware": "^2.0.0"
},

Ahora configure babel-loader en la configuración de su paquete web:

{ test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/ }

agregue un archivo .babelrc a la raíz de su proyecto donde están los módulos de nodo:

{
  "presets": ["es2015", "stage-0", "react"]
}

Más información:

svnm
fuente
1
. El archivo babelrc es lo que me faltaba, ¡gracias! Este es el tutorial completo, la respuesta aceptada solo te lleva hasta cierto punto.
Mike
Información complementaria: No estoy tan seguro acerca de la "etapa-0" en las opciones (también se puede configurar en .babelrc): algunas características pueden no estar incluidas en los estándares oficiales de ES, por lo que normalmente uso la "etapa-3", que es más segura.
Christof Kälin
11

Si está utilizando Webpack> 3, solo necesita instalarlo babel-preset-env, ya que este ajuste preestablecido corresponde a es2015, es2016 y es2017.

var path = require('path');
let webpack = require("webpack");

module.exports = {
    entry: {
        app: './app/App.js',
        vendor: ["react","react-dom"]
    },
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, '../public')
    },
    module: {
        rules: [{
            test: /\.jsx?$/,
            exclude: /node_modules/,
            use: {
                loader: 'babel-loader?cacheDirectory=true',
            }
        }]
    }
};

Esto toma su configuración de mi .babelrcarchivo:

{
    "presets": [
        [
            "env",
            {
                "targets": {
                    "browsers":["last 2 versions"],
                    "node":"current"
                }
            }
        ],["react"]
    ]
}
Sr. Doomsbuster
fuente
1

Debido a las actualizaciones y los cambios con el tiempo, la compatibilidad de la versión comienza a causar problemas con la configuración.

Su webpack.config.js debería ser así; también puede configurar cómo se atenúa.

var path = require('path');
var webpack = require("webpack");

module.exports = {
  entry: './src/js/app.js',
  devtool: 'source-map',
    mode: 'development',
  module: {
    rules: [{
      test: /\.js$/,
      exclude: /node_modules/,
      use: ["babel-loader"]
    },{
      test: /\.css$/,
      use: ['style-loader', 'css-loader']
    }]
  },
  output: {
    path: path.resolve(__dirname, './src/vendor'),
    filename: 'bundle.min.js'
  }
};

Otra cosa a tener en cuenta es el cambio de argumentos, debe leer la documentación de babel https://babeljs.io/docs/en/presets

.babelrc

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

NB: debe asegurarse de tener el @ babel / preset-env & @ babel / preset-react anterior instalado en sus dependencias package.json

Delino
fuente
1
Agregar lo @babel/preset-reactarregló para mí.
kyw
1

ACTUALIZACIÓN DEL EQUIPO BABEL:

Estamos muy 😸 emocionados de que esté intentando usar la sintaxis de ES2015, pero en lugar de continuar con los ajustes preestablecidos anuales, el equipo recomienda usar babel-preset-env. De forma predeterminada, tiene el mismo comportamiento que los ajustes preestablecidos anteriores para compilar ES2015 + a ES5

Si está utilizando la versión 7 de Babel , necesitará ejecutar npm install @ babel / preset-env y tener "presets": ["@ babel / preset-env"] en su .babelrcconfiguración.

Esto compilará todas las funciones más recientes en el código transpilado de es5:

Prerrequisitos :

  1. Webpack 4+
  2. Babel 7+

Paso 1:: npm install --save-dev @ babel / preset-env

Paso 2: para compilar JSXcódigo en es5, babel proporciona un @babel/preset-reactpaquete para convertir reactjsx archivo de extensión de código comprensible del navegador nativo.

Paso 3: instalación de npm --save-dev @ babel / preset-react

Paso 4: cree un .babelrcarchivo dentro de la ruta raíz de su proyecto donde webpack.config.jsexiste.

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

Paso 5: webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    mode: 'development',
    entry: path.resolve(__dirname, 'src/index.js'),
    output: {
        path: path.resolve(__dirname, 'output'),
        filename: 'bundle.js'
    },
    resolve: {
        extensions: ['.js', '.jsx']
    },
    module: {
        rules: [{
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader'
                }
            },
            {
                test: /\.css$/i,
                use: ['style-loader', 'css-loader'],
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: "./public/index.html",
            filename: "./index.html"
         })
    ]
}
Khizer
fuente
0

Al usar TypeScript:

En mi caso, utilicé la sintaxis más reciente de webpack v3.11 de su página de documentación. Acabo de copiar la configuración de cargadores de estilo y CSS de su sitio web. El código comentado (API más reciente) causa este error, ver más abajo.

  module: {
        loaders: [{
                test: /\.ts$/,
                loaders: ['ts-loader']
            },
            {
                test: /\.css$/,
                loaders: [
                    'style-loader',
                    'css-loader'
                ]
            }
        ]
        // ,
        // rules: [{
        //     test: /\.css$/,
        //     use: [
        //         'style-loader',
        //         'css-loader'
        //     ]
        // }]
    }

La forma correcta es poner esto:

    {
        test: /\.css$/,
        loaders: [
            'style-loader',
            'css-loader'
        ]
    }

en la matriz de la propiedad loaders.

Leyendas
fuente
0

Este me lanza a dar una vuelta. Angular 7, Webpack Encontré este artículo, así que quiero dar crédito al artículo https://www.edc4it.com/blog/web/helloworld-angular2.html

Cuál es la solución: // en su archivo de componentes. use template as webpack lo tratará como plantilla de texto: require ('./ process.component.html')

para que karma lo interprete npm install agregue html-loader --save-dev {test: /.html$/, use: "html-loader"},

Espero que esto ayude a alguien

Oliver Champet
fuente