«Вам может понадобиться соответствующий загрузчик для обработки этого типа файлов» с Webpack и Babel

107

Я пытаюсь использовать 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-loader» не работает.

Я использую «babel-loader» 6.0.0.

egidra
источник
1
У меня такая же проблема. babel-preset-es2015 установлен, но у него все еще есть проблемы с использованием JSX в вызове ReactDOM.render (): s
SomethingOn
Какие расширения у вашего файла? Это файлы js или файлы jsx? Ваш загрузчик рассматривает только файлы с расширениями jsx, в этом может быть проблема
cubbuk
По этой ссылке ваша проблема будет решена на 100% [ stackoverflow.com/questions/50149729/…
Mehrdad Masoumi
По этой ссылке ваша проблема будет на 100% решена. Импорт css в next.js
Мехрдад Масуми,

Ответы:

87

Вам необходимо установить es2015пресет:

npm install babel-preset-es2015

а затем настройте babel-loader:

{
    test: /\.jsx?$/,
    loader: 'babel-loader',
    exclude: /node_modules/,
    query: {
        presets: ['es2015']
    }
}
логанфсмиф
источник
37
У меня установлены предустановки и установлен babel-loader. Он по-прежнему дает ту же ошибку
Уманг Гупта
@UG_ Придется задать отдельный вопрос. Нам нужно увидеть всю вашу конфигурацию и полное сообщение об ошибке.
loganfsmyth
1
@UG_ ты нашел решение?
Сарасранглт
35

Убедитесь, что у вас установлена предустановка babel 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-loader в конфигурации вашего веб-пакета:

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

добавьте файл .babelrc в корень вашего проекта, где находятся модули узлов:

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

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

svnm
источник
1
. Файл babelrc - это то, что мне не хватало, спасибо! Это полное руководство, принятый ответ пока только вам поможет.
Майк
Дополнительная информация: Не уверен в параметрах "stage-0" (также можно настроить в .babelrc): некоторые функции могут не входить в официальные стандарты ES, поэтому я обычно использую более безопасный "stage-3".
Christof Kälin
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"]
}

NB: вы должны убедиться, что в ваших зависимостях package.json установлены указанные выше @ babel / preset-env и @ babel / preset-react

Делино
источник
1
Добавление @babel/preset-reactисправило это для меня.
kyw
1

ОБНОВЛЕНИЕ КОМАНДЫ BABEL:

Мы очень рады тому, что вы пытаетесь использовать синтаксис ES2015, но вместо того, чтобы продолжать использовать ежегодные предустановки, команда рекомендует использовать babel-preset-env. По умолчанию он имеет то же поведение, что и предыдущие предустановки для компиляции ES2015 + в ES5.

Если вы используете Babel версии 7, вам нужно будет запустить npm install @ babel / preset-env и иметь в вашей .babelrcконфигурации "presets": ["@ babel / preset-env"] .

Это позволит собрать все новейшие функции в ES5 transpiled код:

Предпосылки :

  1. Webpack 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'
        ]
    }

в массиве свойства loaders.

Легенды
источник
0

Этот бросает меня в штык. Angular 7, Webpack Я нашел эту статью, поэтому хочу отдать должное статье https://www.edc4it.com/blog/web/helloworld-angular2.html

Какое решение: // в вашем файле компонента. использовать шаблон, поскольку веб-пакет будет рассматривать его как текстовый шаблон: require ('./ process.component.html')

чтобы карма интерпретировала это npm install add html-loader --save-dev {test: /.html$/, use: "html-loader"},

Надеюсь, это кому-то поможет

Оливер Шампет
источник