Рендеринг на стороне сервера: css-loader/locals генерирует другие имена классов, а затем bundle.css - веб-пакет
Пытаюсь реализовать изоморфный рендеринг в моем новом проекте, поэтому я читаю множество статей, представляющих такие вещи, как css-loader
, совместное использование состояния и т. д. Поэтому после некоторой борьбы каким-то образом я рендерил свою страницу на стороне сервера с помощью css locals. Поэтому я продолжаю и начинаю создавать другие страницы, потому что все выглядит великолепно, пока я не отключил JavaScript в своем браузере. После этого я обнаружил разницу в html что я получил от сервера имеют разные CSS локальное имя_класса и bundle.css
имеет разные. Я действительно застрял.
Вот мой webpack.config
Я знаю, что делаю что-то не так. Я ценю, если вы укажете.
const webpack = require('webpack');
const path = require('path');
const context = path.resolve(__dirname, 'src');
const nodeExternals = require('webpack-node-externals');
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const config = {
name:"client",
context,
entry: './App.js',
output: {
path: __dirname+"/.build/assets",
filename: 'bundle.js'
},
devtool: "source-map",
module: {
rules: [
{
test:/\.(?:js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader',
},
{
test: /\.(?:css|less)$/,
use: ExtractTextPlugin.extract({
use: [
{
loader: 'css-loader',
options: {
sourceMap: true,
importLoader: true,
localIdentName:'[name]__[local]__[hash:base64:7]'
}
},
{
loader: 'less-loader',
options: {
sourceMap: true,
importLoader: true,
localIdentName:'[name]__[local]__[hash:base64:7]'
}
}
],
fallback: 'style-loader',
}),
exclude: /\.(eot|woff|woff2|ttf|svg)(\?[\s\S]+)?$/
},
{
test: /\.(eot|woff|woff2|ttf|svg)(\?[\s\S]+)?$/,
loader: 'url-loader?limit=1000&name=./fonts/[name].[ext]?[hash:base64:5]#icomoon',
}
]
},
plugins: [
new ExtractTextPlugin({
filename: 'bundle.css',
allChunks: true,
}),
new webpack.DefinePlugin({
"process.env": {
// Mainly used to require CSS files with webpack, which can happen only on browser
// Used as `if (process.env.BROWSER)...`
BROWSER: JSON.stringify(true),
// Useful to reduce the size of client-side libraries, e.g. react
NODE_ENV: JSON.stringify("production")
}
}),
],
resolve: {
extensions: ['.jsx', '.js', '.json']
}
};
const serverConfig = {
name: 'server',
target: 'node',
externals: [nodeExternals()],
entry: [
'./index.js'
],
output: {
path: path.join(__dirname, './.build'),
filename: 'server.build.js',
publicPath: '.build/',
libraryTarget: 'commonjs2'
},
module: {
loaders: [
{
test:/\.(?:js|jsx)$/,
exclude: /node_modules/,
use: 'babel-loader',
},
{
test: /\.(?:css|less)$/,
use: "css-loader/locals?localIdentName=[name]__[local]__[hash:base64:7]",
exclude: /\.(eot|woff|woff2|ttf|svg)(\?[\s\S]+)?$/
},
{
test: /\.(eot|woff|woff2|ttf|svg)(\?[\s\S]+)?$/,
loader: 'url-loader?limit=1000&name=./fonts/[name].[ext]?[hash:base64:5]#icomoon',
}
]
},
resolve: {
extensions: ['.jsx', '.js', '.json']
}
};
module.exports = [config, serverConfig];
Например: я получил .style__header__1H9xAC9
со стороны сервера html
и в bundle.css я получил .style__header__2uiLmVi
но если я включаю JavaScript, приложение снова рендерится на стороне клиента с тем же className, что и bundle.css.
1 ответ
После борьбы с этой проблемой, я обнаружил, что моя ошибка в webpack.config
, я использую context
на стороне клиента, но не на сервере. таким образом я удаляю это из клиента, и все прекрасно работает.
const webpack = require('webpack');
const path = require('path');
const context = path.resolve(__dirname, 'src');
const config = {
name:"client",
context,
entry: './App.js',
output: {
path: __dirname+"/.build/assets",
filename: 'bundle.js'
},
к
const webpack = require('webpack');
const path = require('path');
const config = {
name:"client",
//-----------xxx------------
entry: './App.js',
output: {
path: __dirname+"/.build/assets",
filename: 'bundle.js'
},
Спасибо за внимание:)