"Potrebbe essere necessario un caricatore appropriato per gestire questo tipo di file" con Webpack e Babel


106

Sto provando a utilizzare Webpack con Babel per compilare risorse ES6, ma ricevo il seguente messaggio di errore:

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

Ecco come appare la mia configurazione 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/
      }
    ]
  }
}

Ecco il passaggio del middleware che utilizza 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);
});

Tutto il mio file index.js sta facendo l'importazione di react, ma sembra che il "babel-loader" non funzioni.

Sto usando 'babel-loader' 6.0.0.


1
Ho lo stesso problema. babel-preset-es2015 è installato e tuttavia ha ancora problemi con l'utilizzo di JSX in una chiamata ReactDOM.render (): s
SomethingOn

Quali sono le estensioni del tuo file? Sono file js o file jsx? Il tuo caricatore considera solo i file con estensioni jsx, questo potrebbe essere il problema
cubbuk

A questo link il vostro problema sarà risolto al 100% [ stackoverflow.com/questions/50149729/...
Mehrdad Masoumi

A questo link il tuo problema sarà risolto al 100% importazione CSS su next.js
Mehrdad Masoumi

Risposte:


86

È necessario installare il es2015preset:

npm install babel-preset-es2015

e quindi configurare babel-loader:

{
    test: /\.jsx?$/,
    loader: 'babel-loader',
    exclude: /node_modules/,
    query: {
        presets: ['es2015']
    }
}

37
Ho dei preset installati e anche babel-loader installato. Sta ancora dando lo stesso errore
Umang Gupta

@UG_ Dovrai fare una domanda separata. Avremmo bisogno di vedere l'intera configurazione e il messaggio di errore completo.
loganfsmyth

1
@UG_ hai trovato la soluzione?
Sarasranglt

34

Assicurati di aver installato il preset babel es2015 .

Un esempio package.json devDependencies è:

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

Ora configura babel-loader nella configurazione del tuo webpack:

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

aggiungi un file .babelrc alla radice del tuo progetto dove i moduli del nodo sono:

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

Ulteriori informazioni:


1
. babelrc è quello che mi mancava, grazie! Questo è il tutorial completo, la risposta accettata ti porta solo fino ad ora.
Mike

Informazioni secondarie: Non sono così sicuro dello "stage-0" nelle opzioni (può anche essere configurato in .babelrc): Alcune funzionalità potrebbero non essere presenti negli standard ES ufficiali, quindi di solito uso il più sicuro "stage-3".
Christof Kälin,

11

Se stai usando Webpack> 3, devi solo installare babel-preset-env, poiché questo preset tiene conto di es2015, es2016 ed 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',
            }
        }]
    }
};

Questo prende la sua configurazione dal mio .babelrcfile:

{
    "presets": [
        [
            "env",
            {
                "targets": {
                    "browsers":["last 2 versions"],
                    "node":"current"
                }
            }
        ],["react"]
    ]
}

1

A causa di aggiornamenti e modifiche straordinari, la compatibilità delle versioni inizia a causare problemi con la configurazione.

Il tuo webpack.config.js dovrebbe essere così che puoi anche configurare come dimmi.

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

Un'altra cosa da notare è il cambio di args, dovresti leggere la documentazione di babel https://babeljs.io/docs/en/presets

.babelrc

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

NB: devi assicurarti di avere le @ babel / preset-env e @ babel / preset-react sopra installate nelle tue dipendenze package.json


1
L'aggiunta ha @babel/preset-reactrisolto il problema per me.
kyw

1

AGGIORNAMENTO SQUADRA BABEL:

Siamo super 😸 entusiasti che tu stia cercando di utilizzare la sintassi di ES2015, ma invece di continuare i preset annuali, il team consiglia di utilizzare babel-preset-env. Per impostazione predefinita, ha lo stesso comportamento delle preimpostazioni precedenti per compilare ES2015 + in ES5

Se stai usando la versione 7 di Babel , dovrai eseguire npm install @ babel / preset-env e avere "presets": ["@ babel / preset-env"] nella tua .babelrcconfigurazione.

Questo compilerà tutte le funzionalità più recenti nel codice transpilato es5:

Prerequisiti :

  1. Webpack 4+
  2. Babel 7+

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

Passaggio 2: per compilare il JSXcodice in es5, babel fornisce un @babel/preset-reactpacchetto per convertire il jsxfile di estensione React in codice comprensibile per browser nativo.

Passaggio 3: installazione di npm --save-dev @ babel / preset-react

Passaggio 4: creare il .babelrcfile all'interno del percorso del percorso principale del progetto dove webpack.config.jsesiste.

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

Passaggio 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"
         })
    ]
}

0

Quando si utilizza Typescript:

Nel mio caso ho utilizzato la sintassi più recente di webpack v3.11 dalla loro pagina di documentazione, ho appena copiato la configurazione dei caricatori di stile e CSS dal loro sito web. Il codice commentato (API più recente) causa questo errore, vedi sotto.

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

Il modo giusto è metterlo:

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

nell'array della proprietà loaders.


0

Questo mi fa fare un giro. Angular 7, Webpack Ho trovato questo articolo quindi voglio dare credito all'articolo https://www.edc4it.com/blog/web/helloworld-angular2.html

Qual è la soluzione: // nel file del componente. usa modello come pacchetto web lo tratterà come modello di testo: require ('./ process.component.html')

affinchè karma lo interpreti npm install aggiungi html-loader --save-dev {test: /.html$/, usa: "html-loader"},

Spero che questo aiuti qualcuno

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.