Webpack 2 вопросы с семантической пользовательского интерфейса
Изо всех сил пытался получить семантическую настройку пользовательского интерфейса с помощью Webpack 2. I несколько ошибок, связанных со шрифтами в теме semantic-ui по умолчанию и еще одна ошибка, касающаяся image-webpack-loader
:
ERROR in ./~/css-loader?{"lessPlugins":[{"options":{"paths":{"../../theme.config":"/Users/djthomps/Desktop/demo/theme.config"}}}]}!./~/less-loader!./semantic/src/semantic.less
Module not found: Error: Can't resolve './themes/themes/default/assets/fonts/icons.eot' in '/Users/djthomps/Desktop/demo/semantic/src'
@ ./~/css-loader?{"lessPlugins":[{"options":{"paths":{"../../theme.config":"/Users/djthomps/Desktop/demo/theme.config"}}}]}!./~/less-loader!./semantic/src/semantic.less 6:285117-285174 6:285197-285254
@ ./semantic/src/semantic.less
@ ./app/index.js
@ multi (webpack)-dev-server/client?http://localhost:8080 ./app/index.js
# same for icons.woff2
# same for icons.woff
# same for icons.ttf
# same for icons.svg
ERROR in ./~/css-loader?{"lessPlugins":[{"options":{"paths":{"../../theme.config":"/Users/djthomps/Desktop/demo/theme.config"}}}]}!./~/less-loader!./semantic/src/semantic.less
Module not found: Error: Can't resolve 'image-webpack' in '/Users/djthomps/Desktop/demo'
BREAKING CHANGE: It's no longer allowed to omit the '-loader' suffix when using loaders.
You need to specify 'image-webpack-loader' instead of 'image-webpack'.
@ ./~/css-loader?{"lessPlugins":[{"options":{"paths":{"../../theme.config":"/Users/djthomps/Desktop/demo/theme.config"}}}]}!./~/less-loader!./semantic/src/semantic.less 6:218646-218697
@ ./semantic/src/semantic.less
@ ./app/index.js
@ multi (webpack)-dev-server/client?http://localhost:8080 ./app/index.js
Конечная цель-использовать компоненты react semantic-ui с пользовательской темой, которую я могу просто импортировать в свои файлы .jsx
, как показано в этом примере.
Я следовал этому руководству, чтобы получить установку семантического интерфейса с Webpack 1 с помощью Webpack 2, исправляя меньше-загрузчик различия по пути. Тем не менее, я не могу исправить эти проблемы после того, как прочесал другие проекты, такие как font-awesome-webpack2 и просеял комментарии на github. Вот очень маленький, поддающийся проверке пример:
webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const RewriteImportPlugin = require('less-plugin-rewrite-import');
const HtmlWebpackPluginConfig = new HtmlWebpackPlugin({
template: './app/index.html',
filename: 'index.html',
inject: 'body' // inject scripts before closing body tag
});
module.exports = {
entry: './app/index.js', // where the bundler starts the bundling process
output: { // where the bundled code is saved
path: path.resolve('dist'),
filename: 'index_bundle.js'
},
module: {
loaders: [
{
test: /.(png|jpg|gif|woff|svg|eot|ttf|woff2)$/,
loader: 'url-loader?limit=1024&name=[name]-[hash:8].[ext]!image-webpack'
},
{
test: /.less$/, // import css from 'foo.less';
use: [
'style-loader',
{
loader: 'css-loader',
options: {
// importLoaders: 1,
lessPlugins: [
new RewriteImportPlugin({
paths: {
'../../theme.config': __dirname + '/theme.config',
},
})
]
}
},
'less-loader'
]
},
{
test: /.(ttf|eot|svg)(?v=[0-9].[0-9].[0-9])?$/,
loader: 'file-loader'
}
]
},
devtool: 'eval-source-map',
devServer: { compress: true },
plugins: [ HtmlWebpackPluginConfig ]
};
package.json
{
"name": "demo",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"scripts": {
"start": "webpack-dev-server"
},
"devDependencies": {
"css-loader": "^0.26.1",
"html-webpack-plugin": "^2.28.0",
"image-webpack-loader": "^3.2.0",
"less-loader": "^2.2.3",
"less-plugin-rewrite-import": "^0.1.1",
"semantic-ui": "^2.2.7",
"style-loader": "^0.13.1",
"url-loader": "^0.5.7",
"webpack": "^2.2.1",
"webpack-dev-server": "^2.3.0"
}
}
app/index.js
import css from '../semantic/src/semantic.less';
app/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Demo</title>
</head>
<body>
<button class="ui button">Follow</button>
</body>
</html>
theme.config
// truncated for brevity
@button : 'gmail';
Структура моего проекта выглядит следующим образом:
.
├── app
│ ├── index.html
│ └── index.js
├── package.json
├── semantic
│ ├── gulpfile.js
│ ├── src
│ └── tasks
├── semantic.json
├── theme.config
└── webpack.config.js
Обновление 1
Я размышлял над этим. возможные решения:
-
postinstall
скрипт, который перемещает мойtheme.config
в папкуsemantic
, а затем строитsemantic
что-то вроде этого учебника -
postinstall
скрипт для замены всего импортаtheme.config
на мою версию (чтоRewriteImportPlugin
должен обрабатывать) - настройка отдельной задачи gulp для обработки перемещения файлов и построения semantic-ui
- используйте webpack 2 end-to-end (предпочтительно)
Обновление 2
ERROR in ./~/css-loader?{"lessPlugins":[{"options":{"paths":{"../../theme.config":"/Users/djthomps/Desktop/demo/theme.config"}}}]}!./~/less-loader!./semantic/src/semantic.less
Module not found: Error: Can't resolve 'image-webpack' in '/Users/djthomps/Desktop/demo'
BREAKING CHANGE: It's no longer allowed to omit the '-loader' suffix when using loaders.
You need to specify 'image-webpack-loader' instead of 'image-webpack'.
@ ./~/css-loader?{"lessPlugins":[{"options":{"paths":{"../../theme.config":"/Users/djthomps/Desktop/demo/theme.config"}}}]}!./~/less-loader!./semantic/src/semantic.less 6:218646-218697
@ ./semantic/src/semantic.less
@ ./app/index.js
@ multi (webpack)-dev-server/client?http://localhost:8080 ./app/index.js
Фиксируется регулировкой конфигурационный файл:
loader: 'url-loader?limit=1024&name=[name]-[hash:8].[ext]!image-webpack-loader' // note the loader at the end
3 ответа:
После того, как я бился головой в течение трех дней, я, наконец, смог понять это по большей части.
webpack.config.js
const path = require('path'); const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './app/index.js', // where the bundler starts the bundling process output: { // where the bundled code is saved path: path.resolve('dist'), filename: 'index_bundle.js' }, resolve: { alias: { semantic: path.resolve(__dirname, 'semantic/src/'), jquery: path.resolve(__dirname, 'node_modules/jquery/src/jquery') } }, module: { loaders: [ { test: /\.(png|gif)$/, loader: 'url-loader?limit=1024&name=[name]-[hash:8].[ext]!image-webpack-loader' }, { test: /\.jpg$/, loader: 'file-loader' }, { test: /\.less$/, // import css from 'foo.less'; use: [ 'style-loader', 'css-loader', 'less-loader' ] }, { test: /\.(ttf|eot|svg|woff2?)(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'file-loader' } ] }, devtool: 'eval-source-map', devServer: { compress: true }, plugins: [ new HtmlWebpackPlugin({ template: './app/index.html', filename: 'index.html', inject: 'body' // inject scripts before closing body tag }), new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', 'window.jQuery': 'jquery' }) ] };
Но загвоздка в том, что если вы хотите использовать встроенные шрифты, вам нужно исправить пути, потому что они разрешены неправильно после мы выполняем загрузчик
less-loader
(где ошибка остается загадкой). Я создал удобный шаблон как очень минимальный пример с некоторыми дополнительными деталями.
Надеюсь, что это укажет вам правильное направление, даже если это не полное решение. Как я уже упоминал, я потратил смешное количество времени, пытаясь заставить Semantic-UI работать с Webpack 2. Я использую шаблон Webpack из vue-cli для проекта VueJS. Я попытался удалить конфигурацию Vue из шаблона, чтобы получить пример, который был агностиком фреймворка, но это не сработало.
Похоже, что вы просто пытаетесь получить настройку Semantic-UI CSS, а не их компоненты JS. Все дополнения, которые я сделал к шаблону Vue Webpack, связаны с JS, в основном просто для включения jQuery для Semantic-UI. Поэтому, если вы заинтересованы только в том, чтобы CSS работал, эти дополнения не нужны.
Чтобы настроить шаблон для работы с Semantic-UI JS, я добавил Это в
module-exports
alias: { ... jquery: "jquery/src/jquery", }, ... plugins: [ new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery", "window.jQuery": "jquery" }) ]
Я запускаю задачу Semantic Gulp для сборки в свою собственную папку dist, а затем я могу просто включить эти файлы в свой main.запись js для webpack.
import '../semantic/dist/semantic.css' import '../semantic/dist/semantic'
Это должно быть самым элегантным способом заставить семантическую тематизацию пользовательского интерфейса работать для webpack2.
Спасибо за идею из этого выпуска, я обновил свой учебник React+Webpack1/2/3+семантический интерфейс и как сделать тематизацию и демонстрационный проект
Пожалуйста, следуйте инструкциям или прокрутите страницу вниз, чтобы увидеть основные изменения, которые вам нужно сделать. Эти два ключевых отличия от Webpack1:
- по умолчанию less-loader будет использовать распознаватель webpack для решить все меньше файлов, создание плагинов как меньше-плагин-переписать-импорт не меньше файлов. Вот почему вы обнаружите, что плагин не работает для webpack2. Чтобы заставить less-loader использовать свой собственный решатель, вам нужно вручную указать пути опций для его поиска (посмотрите на конфигурацию webpack, вставленную ниже)
- поскольку теперь мы используем меньше решателя, мы больше не можем использовать
~
для ссылки на модули в node_modules, поэтому откройте вашtheme.config
и измените@import "~semantic-ui-less/theme.less";
на@import "semantic-ui-less/theme.less";
const path = require('path'); const webpack = require('webpack'); const RewriteImportPlugin = require("less-plugin-rewrite-import"); const HtmlWebpackPlugin = require('html-webpack-plugin'); const ROOT_DIR = path.resolve(__dirname); const SRC_DIR = path.resolve(__dirname, 'app'); const BUILD_DIR = path.resolve(__dirname, 'build'); const NODE_MODULES_DIR = path.resolve(__dirname, 'node_modules'); var webpackConfig = { devtool: 'eval', entry: { index: path.resolve(SRC_DIR, 'index.js'), }, output: { path: BUILD_DIR, filename: '[name].[hash:8].js', }, resolve: { modules: [ROOT_DIR, 'node_modules'], }, module: { rules: [ { test: /\.(less|config)/, use: [ 'style-loader', 'css-loader', { loader: 'less-loader', options: { paths: [ROOT_DIR, NODE_MODULES_DIR], plugins: [ new RewriteImportPlugin({ paths: { '../../theme.config': __dirname + '/app/semantic-ui/theme.config', }, }), ], }, }, ], }, { test: /\.(png|jpg|gif|woff|svg|eot|ttf|woff2)$/, use: [ { loader: 'file-loader' }, ], }, { test: /\.html$/, loader: 'html-loader', }, { test: /\.jsx?$/, exclude: /(node_modules|bower_components)/, loader: 'babel-loader', query: {presets: ['es2015']} }, ], }, plugins: [ new HtmlWebpackPlugin({ inject: 'body', template: 'app/index.html', filename: 'index.html', chunks: ['index'], chunksSortMode: 'dependency', env: process.env, }), ], }; module.exports = webpackConfig;