#javascript #node.js #reactjs #webpack #babeljs
#javascript #node.js #reactjs #webpack #babeljs
Вопрос:
Я новичок в webpack и react. надеюсь, вы сможете мне помочь.
Я столкнулся с проблемой и не могу найти никакого рабочего решения в Интернете. Когда я пытаюсь запустить webpack-dev-serverI, получающий сообщение «Модуль не найден: Ошибка: не удается разрешить ошибку модуля ‘components / app'» постоянно.
Вот структура моих файлов.
root / webpack.config.js
var webpack = require('webpack');
var path = require('path');
module.exports = {
devtool: 'inline-source-map',
entry: [
'webpack-dev-server/client?http://127.0.0.1:8080/',
'webpack/hot/only-dev-server',
'./src'
],
output: {
path: path.join(__dirname, 'public'),
filename: 'bundle.js'
},
resolve: {
moduleDirectories: ['node_modules', 'src'],
extensions: ['', '.js']
},
module: {
loaders: [{
test: /.js$/,
loader: 'babel-loader',
exclude: /node_modules/,
query: {
presets: ['es2015', 'react']
}
}]
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin()
]
};
root / .babelrc
{
presets: ["react", "es2015"],
plugins: ["react-hot-loader/babel"]
}
root/src/index.js
import React from 'react';
import { render } from 'react-dom';
import App from 'components/app';
render(<App />, document.getElementById('app'));
root/src/components/app.js
import React from 'react';
export default class App extends React.component {
render() {
return (
<div>
<h1>Hello There</h1>
</div>
);
}
}
Ответ №1:
Я согласен с ответом Роберта Москаля, используйте относительный путь для импорта, в то же время, если вы действительно хотите, чтобы абсолютный путь работал, возможно, вам придется добавить еще одну строку в свой webpack.config.js
раздел «Разрешить», добавьте эту строку ниже
root: path.resolve('./src'),
это поможет устранить корень, и вы сможете легко импортировать, используя абсолютный путь, из папок внутри папки src. Я бы показал вам свой пример webpack.config.js
ниже
'use strict';
const path = require('path');
const loaders = require('./webpack/loaders');
const plugins = require('./webpack/plugins');
const applicationEntries = process.env.NODE_ENV === 'development'
? ['webpack-hot-middleware/client?reload=true']
: [];
const mainEntry = process.env.NODE_ENV === 'development'
? './src/sample/index.tsx'
: './src/lib/index.tsx';
module.exports = {
entry: [mainEntry].concat(applicationEntries),
output: {
path: path.join(__dirname, 'dist'),
filename: '[name].js',
publicPath: '/',
sourceMapFilename: '[name].js.map',
chunkFilename: '[id].chunk.js',
},
devtool: process.env.NODE_ENV === 'production' ?
'source-map' :
'inline-source-map',
resolve: {
root: path.resolve('./src'),
extensions: [
'',
'.webpack.js',
'.web.js',
'.tsx',
'.ts',
'.js',
'.json',
],
},
plugins: plugins,
devServer: {
historyApiFallback: { index: '/' },
},
module: {
preLoaders: [
loaders.tslint,
],
loaders: [
loaders.tsx,
loaders.html,
loaders.css,
loaders.scss,
loaders.eot,
loaders.svg,
loaders.ttf,
loaders.woff,
loaders.json,
{
test: /.png$/,
loader: 'url-loader',
query: { mimetype: 'image/png' },
},
],
},
externals: {
'react/lib/ReactContext': 'window',
'react/lib/ExecutionEnvironment': true,
'react/addons': true,
},
};
Комментарии:
1. Большое спасибо @KeshShan за ваш webpack.config.js пример и корень: path.resolve совет
2. @AntonArtemev нет проблем, рад, что мой ответ помог вам !! 🙂
3. Хороший ответ, хотя, если кто-то в проекте отправил запрос на извлечение с подобным взломом webpack, я бы посоветовал им просто следовать соглашению об импорте модуля es6.
Ответ №2:
Вам необходимо указать относительный путь к приложению в вашем index.js файл. Итак
import App from './components/app'
Без обозначения относительного пути система импорта модуля просматривает каталог node_modules.
Ответ №3:
Вы ищете псевдоним модуля. resolve
Раздел вашей конфигурации должен выглядеть примерно так:
const path = require('path');
resolve: {
modules: [path.resolve(__dirname, 'src'), 'node_modules'],
extensions: ['', '.js'],
alias: {
components: path.resolve(__dirname, 'src/components/')
}
}
Это эквивалентно paths
опции в файлах конфигурации TypeScript.