服务器端渲染:'css-loader/locals' 生成不同的类名然后 bundle.css - webpack
Server Side render : 'css-loader/locals' generate different classNames then bundle.css - webpack
尝试在我的新项目中实现同构渲染,所以我阅读了很多文章,比如 css-loader
、状态共享等。因此,经过一番努力之后,我以某种方式在服务器端呈现我的页面 css locals.So 我继续并开始构建其他页面因为一切看起来都很棒,直到我没有禁用 javascript 在我的浏览器上.之后
我发现我从服务器收到的 html 上的差异有不同的 css 本地类名,bundle.css
也不同。我真的卡住了。
这是我的 webpack.config
。我知道我正在做一些事情 wrong.I 如果你指出,我将不胜感激。
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];
例如:我从服务器端 html
得到了 .style__header__1H9xAC9
并且在 bundle.css 中得到了 .style__header__2uiLmVi
但是如果我启用 JavaScript,
应用程序再次在客户端呈现 bundle.css 包含的相同类名。
在解决这个问题之后,我发现我的错误在 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'
},
感谢您的关注:)
尝试在我的新项目中实现同构渲染,所以我阅读了很多文章,比如 css-loader
、状态共享等。因此,经过一番努力之后,我以某种方式在服务器端呈现我的页面 css locals.So 我继续并开始构建其他页面因为一切看起来都很棒,直到我没有禁用 javascript 在我的浏览器上.之后
我发现我从服务器收到的 html 上的差异有不同的 css 本地类名,bundle.css
也不同。我真的卡住了。
这是我的 webpack.config
。我知道我正在做一些事情 wrong.I 如果你指出,我将不胜感激。
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];
例如:我从服务器端 html
得到了 .style__header__1H9xAC9
并且在 bundle.css 中得到了 .style__header__2uiLmVi
但是如果我启用 JavaScript,
应用程序再次在客户端呈现 bundle.css 包含的相同类名。
在解决这个问题之后,我发现我的错误在 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'
},
感谢您的关注:)