Миграция RequireJS/AMD с плагинами в Webpack
Я работаю над переносом большого приложения RequireJS в Webpack. Кажется, что базовая сборка с Webpack работает нормально - я переместил определения "путей" в "псевдоним" и установил загрузчики для своего контента и шиммов, например, jQuery.
Однако есть еще одна проблема, которую я не знаю, как решить. В основном приложение RequireJS использует "текстовый плагин" для включения шаблонов HTML, а Webpack выдает ошибки "Модуль не найден" для шаблонов HTML.
Пример модуля AMD, который я хочу связать, выглядит примерно так:
Модуль AMD с текстовым плагином
define([
'security',
'modals',
'text!../templates/contact_info.html'
], function(security, modals, contactInfoTemplate) {
return {
foo: function() { return "bar"; }
};
});
Я думал, что смогу использовать raw-загрузчик для загрузки файлов шаблонов. Я добавил псевдоним 'text' в 'raw-loader':
text: {
test: /\.html$/,
loader: "raw-loader"
},
Тем не менее, я вижу следующую ошибку для всех моих шаблонов, которые требуются, как указано выше:
Module not found: Error: Can't resolve 'text'
BREAKING CHANGE: It's no longer allowed to omit the '-loader' suffix when using loaders. You need to specify 'text-loader' instead of 'text'.
Я попытался заменить 'text!...' на 'text-loader!...', и затем я вижу эту ошибку с жалобой на то, что он не может загрузить / найти модуль HTML!
Module not found: Error: Can't resolve '../templates/contact_info.html'
webpack.config.js, версия 3.9.1
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const path = require('path');
const webpack = require('webpack');
let basePath = path.join(__dirname, '/');
module.exports = {
entry: {
'main': basePath + 'js/main.js',
},
context: __dirname,
output: {
path: __dirname + '/build',
filename: '[name].min.js',
libraryTarget: 'amd',
umdNamedDefine: true
},
module: {
rules: [
{
test: /(\.js)$/,
exclude: /(node_modules)/,
use: {
// babel-loader to convert ES6 code to ES5 + amdCleaning requirejs code into simple JS code, taking care of modules to load as desired
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: []
}
}
},
{
test: /\.css$/,
use: [
{ loader: "style-loader" },
{ loader: "css-loader" }
]
},
{ test: /\.jpg$/, use: [ "file-loader" ] },
{ test: /\.png$/, use: [ "url-loader?mimetype=image/png" ] },
{
test: /\.(html)$/,
use: {
loader: 'raw-loader',
options: {
minimize: true
}
}
}
]
},
resolve: {
modules: [
'js/**/*.js',
'node_modules',
path.resolve('./js')
],
extensions: ['.js'], // File types,
alias: {
text: {
test: /\.html$/,
loader: "raw-loader"
},
bridge: 'libs/bridge',
cache: 'libs/cache',
cards: 'libs/cards',
moment: 'libs/moment',
underscore: 'libs/underscore',
}
},
plugins: [
new CleanWebpackPlugin(['dist']),
new HtmlWebpackPlugin({
filename: 'index.html',
template: '../index.html'
}),
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery'
})
]
};
Кто-нибудь знает, как заставить Webpack хорошо играть с плагином RequireJS Text?
Спасибо!
0 ответов
Может быть, попробуйте установить text-loader
?
Для того, чтобы что-то вроде 'text!../templates/contact_info.html'
чтобы "загрузить" правильно, так как это не JS, вам необходимо установить text-loader
чтобы получить веб-пакет, чтобы понять синтаксис text!
,
npm install text-loader --save-dev
хм... я только что установил text-loaded
и кажется, что мы также должны изменить text!
в text-loader!