Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't Webpack resolve ‘babel-loader’?

When I configure Webpack for this code base, Webpack complains that it Can't resolve 'babel-loader'. What exactly is failing, and how can I ask Webpack what its complaint is?

The Webpack configuration:

// webpack.config.js

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

module.exports = {
    entry: './source/main.jsx',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'app.js',
    },
    resolve: {
        modules: [
            path.resolve(__dirname, 'source'),
            '/usr/share/javascript',
            '/usr/lib/nodejs',
        ],
    },
    module: {
        loaders: [
            // Transform JSX with React.
            {
                test: /\.jsx$/,
                loader: 'babel-loader',
                query: {
                    presets: ['es2015', 'react'],
                },
            },
        ],
    },
};

The entry module:

// source/main.jsx

"use strict";

import Application from './components/Application';

const applicationElement = <Application />;
ReactDOM.render(
    applicationElement,
    document.getElementById('application'),
);

Is the problem something like a search path, and if so why can't the error tell me what setting I need to correct?

The babel-loader module is definitely installed. (I therefore don't want to install it again – so npm install won't help – I am trying to tell Webpack to use it from the already-installed location.) Its package definition is at /usr/lib/nodejs/babel-loader/package.json.

I've pointed Webpack's resolver there – instead of its default resolver behaviour – using the resolve.modules list of search paths. Correct?

So the resolver should be able to find it there by the specified search path /usr/lib/nodejs and the name babel-loader, no?

(This raises a separate question, about how to convince Webpack to just tell me what it's looking for so it can be diagnosed more easily.)

How can I tell Webpack the specific location it should use to resolve that babel-loader name?

like image 546
bignose Avatar asked Jun 16 '18 01:06

bignose


People also ask

Can not Resolve babel-loader?

To solve the error "Module not found: Error: Can't resolve 'babel-loader'", make sure to install the babel-loader package by opening your terminal in your project's root directory and running the command npm install -D babel-loader and restart your development server. Copied!

Can I use Babel with Webpack?

There is a specific folder structure to be followed when using Webpack and Babel in your project. We need two separate folders, dist for the output files and src for the input files. You have to keep the index. html file inside the dist folder.

Can Babel be used without Webpack?

If you just want to get started on React real quick and you don't mind using require or import in your code, then babel could be enough to jump start your React project. Say for example that all your javascript files are in the ./src folder, you can bundle them into one file with this command.

Does Babel run before Webpack?

For . js and . jsx files, we tell Webpack to use babel-loader which makes Webpack run these files through Babel before bundling them.


1 Answers

The Webpack configuration setting resolve is for modules that are imported. The loaders are resolved differently; the resolveLoader setting configures how to resolve the loaders specifically.

So, adding resolveLoader to the Webpack configuration works:

// webpack.config.js

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

module.exports = {
    entry: './source/main.jsx',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'app.js',
    },
    resolve: {
        // Configure how Webpack finds modules imported with `import`.
        modules: [
            path.resolve(__dirname, 'source'),
            '/usr/share/javascript',
            '/usr/lib/nodejs',
        ],
    },
    resolveLoader: {
        // Configure how Webpack finds `loader` modules.
        modules: [
            '/usr/lib/nodejs',
        ],
    },
    module: {
        loaders: [
            // Transform JSX with React.
            {
                test: /\.jsx$/,
                loader: 'babel-loader',
                query: {
                    presets: ['es2015', 'react'],
                },
            },
        ],
    },
};
like image 87
bignose Avatar answered Sep 28 '22 04:09

bignose