gpt4 book ai didi

reactjs - [Webpack][React] 在带有代码拆分的 SSR 上,我如何获得页面所需的 block 列表?

转载 作者:行者123 更新时间:2023-12-05 05:13:14 25 4
gpt4 key购买 nike

我有一个具有完美工作的 SSR 和 Webpack 代码拆分的 React 应用程序。

我的 webpack.config.js 看起来像这样:

const webpack = require('webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const ServerMiniCssExtractPlugin = require("./server/utils/serverMiniCssExtractPlugin");

module.exports = [{
name: 'react-app',
mode: 'development',
devtool: 'eval',
cache: true,
entry: {
main: [
'babel-polyfill',
'webpack-hot-middleware/client',
'./react/index.tsx',
],
},
output: {
path: `${__dirname}/dist/__build__`,
filename: '[name].js',
chunkFilename: '[name].js',
publicPath: '/__build__/',
},
module: {
rules: [{
test: /\.(ts|js)x?$/,
loader: 'babel-loader',
exclude: [/node_modules/],
}, {
test: /\.scss$/,
oneOf: [{
resourceQuery: /^\?raw$/,
use: [MiniCssExtractPlugin.loader, {
loader: 'css-loader',
options: {
modules: true,
sourceMap: true,
camelCase: false,
localIdentName: '[local]',
},
}, 'sass-loader', 'postcss-loader'],
}, {
use: [MiniCssExtractPlugin.loader, {
loader: 'css-loader',
options: {
modules: true,
sourceMap: true,
camelCase: true,
localIdentName: '[path]___[name]__[local]___[hash:base64:5]',
},
}, 'sass-loader', 'postcss-loader'],
}]
}],
},
resolve: {
extensions: ['.ts', '.tsx', '.js'],
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(),
new webpack.DefinePlugin({
'process.env': {
CLIENT: JSON.stringify(true),
},
}),
new webpack.IgnorePlugin(/^vertx$/),
new MiniCssExtractPlugin({
filename: "style.css",
chunkFilename: "style.chunk.[id].css"
}),
],
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /node_modules/,
name: 'vendor',
enforce: true
},
},
},
},
}, {
name: 'server-side rendering',
mode: 'development',
devtool: 'eval',
cache: true,
entry: [
'./react/ssr.tsx',
],
target: 'node',
output: {
path: `${__dirname}/dist/__server__/`,
filename: 'ssr.js',
publicPath: '/__server__/',
libraryTarget: 'commonjs2',
},
resolve: {
extensions: ['.ts', '.tsx', '.js'],
},
module: {
rules: [{
test: /\.(ts|js)x?$/,
exclude: [/node_modules/, /.+\.config.js/],
loader: 'babel-loader',
}, {
test: /\.scss$/,
oneOf: [{
resourceQuery: /^\?raw$/,
use: [ServerMiniCssExtractPlugin.loader, {
loader: 'css-loader',
options: {
modules: true,
sourceMap: true,
camelCase: false,
localIdentName: '[local]',
},
}, 'sass-loader', 'postcss-loader'],
}, {
use: [ServerMiniCssExtractPlugin.loader, {
loader: 'css-loader',
options: {
modules: true,
sourceMap: true,
camelCase: true,
localIdentName: '[path]___[name]__[local]___[hash:base64:5]',
},
}, 'sass-loader', 'postcss-loader'],
}]
}],
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(),
new webpack.DefinePlugin({
'process.env': {
SERVER: JSON.stringify(true),
},
}),
new webpack.IgnorePlugin(/^vertx$/),
new ServerMiniCssExtractPlugin({
filename: "style.css",
chunkFilename: "style.chunk.[id].css"
}),
],
}];

... 并且它为使用该应用程序的 js 和 css 生成 block ,当从不同的页面移动时正确加载这些 block ,所有这些都使用 react-router 进行映射。

问题是,当我重新加载其中一个页面时,所需的 css block 在渲染后加载,而不是直接从 SSR 链接到页面中,所以有那么一秒钟我有 FOUC .

因为当我对应用程序进行 SSR 时,我想使用 React-Helmet 在页面头部注入(inject)所需的 css block ,所以我如何在代码中获取我重新加载的页面所需的 block 文件名列表?

假设页面需要:0.js2.js样式. block .0.css样式. block .2.css

如何获取这些文件的列表以便在页眉中动态生成链接?

谢谢。

最佳答案

使用 webpack-manifest-plugin 生成一个 manifest.json 文件,其中将包含所有 block 的列表。

在你的 webpack.config.js 中:

var ManifestPlugin = require('webpack-manifest-plugin');

module.exports = {
// ...
plugins: [
new ManifestPlugin()
]
};

这将在您的根输出目录中生成一个 manifest.json 文件,其中包含所有源文件名与其对应输出文件的映射,例如:

{
"mods/alpha.js": "mods/alpha.1234567890.js",
"mods/omega.js": "mods/omega.0987654321.js"
}

关于reactjs - [Webpack][React] 在带有代码拆分的 SSR 上,我如何获得页面所需的 block 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53835393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com