"Вам може знадобитися відповідний завантажувач для обробки цього типу файлів" з Webpack та Babel


106

Я намагаюся використовувати Webpack з Babel для компіляції активів ES6, але я отримую таке повідомлення про помилку:

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

Ось як виглядає моя конфігурація 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/
      }
    ]
  }
}

Ось крок проміжного програмного забезпечення, який використовує 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);
});

Весь мій файл index.js працює на імпорт реагування, але здається, що "навантажувач babel" не працює.

Я використовую 'babel-loader' 6.0.0.


1
У мене така ж проблема. babel-preset-es2015 встановлено, але все ще виникають проблеми з використанням JSX для виклику ReactDOM.render (): s
SomethingOn

Що таке розширення вашого файлу? Це js-файли чи jsx-файли? Ваш завантажувач розглядає лише файли з розширеннями jsx, що може бути проблемою
cubbuk

У зв'язку з цим ваша проблема буде вирішена на 100% [ stackoverflow.com/questions/50149729 / ...
Мердад Масумі

За цим посиланням ваша проблема буде вирішена на 100% імпортом css до next.js
Мехрдад Масумі

Відповіді:


86

Потрібно встановити es2015попередньо встановлене:

npm install babel-preset-es2015

а потім налаштуйте babel-loader:

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

37
У мене також встановлені пресети та встановлений навантажувач. Це все ще дає ту саму помилку
Уманг Гупта

@UG_ Вам доведеться задати окреме запитання. Нам потрібно побачити весь конфігурацію та повне повідомлення про помилку.
loganfsmyth

1
@UG_ ти знайшов рішення?
Sarasranglt

34

Переконайтеся, що у вас встановлено попередньо встановлену клавішу es2015 .

В якості прикладу 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"
},

Тепер налаштуйте навантажувач babel у своєму конфігурації веб-пакету:

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

додайте файл .babelrc до кореня проекту, де є модулі вузлів:

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

Більше інформації:


1
. Файл babelrc - це те, чого я бракував, дякую! Це повний підручник, прийнята відповідь отримує вас лише поки що.
Майк

Побічна інформація: Не настільки впевнений у параметрі "етап-0" (також можна налаштувати в .babelrc): Деякі функції можуть не вносити його в офіційні стандарти ES, тому я зазвичай використовую більш безпечний "етап-3".
Крістоф Келін

11

Якщо ви використовуєте Webpack> 3, то вам потрібно лише встановити babel-preset-env, оскільки цей попередньо встановлений обліковий запис для es2015, es2016 та 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',
            }
        }]
    }
};

Це налаштовує конфігурацію з мого .babelrcфайлу:

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

1

Через оновлення та зміни понаднормово, сумісність версій починає викликати проблеми з конфігурацією.

Ваш webpack.config.js має бути таким, ви також можете налаштувати те, як колись у вас тьмяний.

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

Ще одне, що слід помітити, що це зміна аргументів, вам слід ознайомитись з babel документацією https://babeljs.io/docs/en/presets

.babelrc

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

Примітка: ви повинні переконатися, що у вас вказані вище @ babel / preset-env & @ babel / preset-react встановлені у вашому пакеті.json


1
Додавання @babel/preset-reactвиправлено для мене.
kyw

1

ОНОВЛЕННЯ БАБЕЛЬНОЇ КОМАНДИ:

Ми дуже раді, що ви намагаєтеся використовувати синтаксис ES2015, але замість продовження щорічних пресетів команда рекомендує використовувати babel-preset-env. За замовчуванням він має таку поведінку, що і попередні пресети для компіляції ES2015 + до ES5

Якщо ви використовуєте Babel версії 7, вам потрібно буде запустити npm install @ babel / preset-env і мати "preseset": ["@ babel / preset-env"] у своїй .babelrcконфігурації.

Це дозволить зібрати всі найновіші функції для перекладеного коду es5 :

Передумови :

  1. Вебпак 4+
  2. Вавилон 7+

Крок 1:: npm install --save-dev @ babel / preset-env

Крок 2: Для компіляції JSXкоду до es5 babel передбачений @babel/preset-reactпакет для перетворення jsxфайлу розширення реагування в зрозумілий кодекс браузера.

Крок 3: встановлення npm --save-dev @ babel / preset-react

Крок 4: створіть .babelrcфайл у корінному шляху вашого проекту там, де він webpack.config.jsіснує.

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

Крок 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

Під час використання Typescript:

У моєму випадку я використав новіший синтаксис webpack v3.11 зі сторінки їх документації, я просто скопіював конфігурацію завантажувачів css та стилів із свого веб-сайту. Коментований код (новіший API) викликає цю помилку, див. Нижче.

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

Правильний спосіб полягає в наступному:

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

у масиві властивостей завантажувачів.


0

Цей кине мене на віджимання. Angular 7, Webpack Я знайшов цю статтю, тому хочу віддати статтю https://www.edc4it.com/blog/web/helloworld-angular2.html

Що таке рішення: // у файлі вашого компонента. використання шаблону як веб-пакета буде вважати його текстовим шаблоном: вимагати ('./ process.component.html')

щоб карма інтерпретувала її npm install, додайте html-loader --save-dev {test: /.html$/, використовуйте: "html-loader"},

Сподіваюся, це комусь допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.