如您所知,服務器端渲染會在您的節點服務器中呈現您的反應組件。但節點服務器不支持導入css/png文件。
如果您不想更改客戶端代碼,則可以嘗試用戶webpack-isomorphic-tools,它將幫助您生成一個assert.json文件,該文件可以使require('* .css')調用返回一個json
對象並生成CSS類名映射,就像他們在webpack css-loader
中做的一樣。
如果你有興趣,你可以看看demo。
這裏是你的WebPack同構,tools.js
var WebpackIsomorphicToolsPlugin = require('webpack-isomorphic-tools/plugin');
module.exports = {
assets: {
images: {
extensions: [
'jpeg',
'jpg',
'png',
'gif'
],
parser: WebpackIsomorphicToolsPlugin.url_loader_parser
},
fonts: {
extensions: [
'woff',
'woff2',
'ttf',
'eot'
],
parser: WebpackIsomorphicToolsPlugin.url_loader_parser
},
svg: {
extension: 'svg',
parser: WebpackIsomorphicToolsPlugin.url_loader_parser
},
bootstrap: {
extension: 'js',
include: ['./src/theme/bootstrap.config.js'],
filter: function(module, regex, options, log) {
function is_bootstrap_style(name) {
return name.indexOf('./src/theme/bootstrap.config.js') >= 0;
}
if (options.development) {
return is_bootstrap_style(module.name) && WebpackIsomorphicToolsPlugin.style_loader_filter(module, regex, options, log);
}
},
path: WebpackIsomorphicToolsPlugin.style_loader_path_extractor,
parser: WebpackIsomorphicToolsPlugin.css_loader_parser
},
style_modules: {
extensions: ['less','scss'],
filter: function(module, regex, options, log) {
if (options.development) {
return WebpackIsomorphicToolsPlugin.style_loader_filter(module, regex, options, log);
} else {
return regex.test(module.name);
}
},
path: function(module, options, log) {
if (options.development) {
return WebpackIsomorphicToolsPlugin.style_loader_path_extractor(module, options, log);
} else {
return module.name;
}
},
parser: function(module, options, log) {
if (options.development) {
return WebpackIsomorphicToolsPlugin.css_modules_loader_parser(module, options, log);
} else {
return module.source;
}
}
}
}
}
和你server.js應該是這樣的
function renderFullPage (title, css, html, initialState) {
return `
<!DOCTYPE html>
<html>
<head>
<title>${title}</title>
<style type="text/css">${css}</style>
</head>
<body>
<div id="app">${html}</div>
<script>
window.__INITIAL_STATE__ = ${JSON.stringify(initialState)};
</script>
<script src="/assets/scripts/app.bundle.js"></script>
</body>
</html>
`;
}
const asyncStore = (store, renderProps) => {
let promise = Promise.all([
store.dispatch(queryArtistList()),
store.dispatch(queryAuth())
]);
return promise;
}
const HomeCtrl = {
index: async (req, res) => {
// 補全同構應用運行時缺失的全局對象
global.window = {
navigator: {
userAgent: req.get('User-Agent'),
},
location: {
protocol: req.protocol + ':',
hostname: req.hostname,
},
};
match({ routes, location: req.url }, async (err, redirectLocation, renderProps) => {
if (err) {
res.status(500).end(`Internal Server Error ${err}`);
} else if (redirectLocation) {
res.redirect(redirectLocation.pathname + redirectLocation.search + '/');
} else if (renderProps) {
let store = configureStore();
const state = store.getState();
await asyncStore(store, renderProps);
const components = (<Provider store={store}>
<RouterContext {...renderProps} />
</Provider>);
const html = renderToStaticMarkup(components);
res.end(renderFullPage('tokyo Artist', '', html, store.getState()));
} else {
res.status(404).end('Not found');
}
})
}
}
,並請確保,啓動服務器後,你有你的生成webpack-asserts.json
;
所以你app.js
應該是這樣的:
#!/usr/bin/env node
const path = require('path');
const rootDir = path.resolve(__dirname, '..');
const fs = require('fs');
const babelrc = fs.readFileSync(rootDir + '/.babelrc', 'utf-8');
var config;
try {
config = JSON.parse(babelrc);
} catch (err) {
console.error('==> ERROR: Error parsing your .babelrc.');
console.error(err);
}
require('babel-register')(config);
/**
* Define isomorphic constants.
*/
global.__CLIENT__ = false;
global.__SERVER__ = true;
global.__DEVELOPMENT__ = process.env.NODE_ENV !== 'production';
global.__DEVTOOLS__ = __DEVELOPMENT__;
const WebpackIsomorphicTools = require('webpack-isomorphic-tools');
global.webpackIsomorphicTools = new WebpackIsomorphicTools(require('../webpack/webpack.isomorphic-tools'))
.development(__DEVELOPMENT__)
.server(__DEVELOPMENT__ ? __dirname : rootDir, function() {
require('../server/app.js');
});
感謝詳細的解答! –