javascript - 如何在服务器端渲染图像?

标签 javascript node.js image reactjs express

我如何使用 React 在服务器端渲染图像和 css 文件?

这是我的服务器代码:

const express = require('express')
const router = express.Router()
const ReactDOM = require('react-dom/server');

import Master from '../../../client/Master'

router.get('/', (req, res) => {
    res.render('test.html', {reactOutput: ReactDOM.renderToString(<Master/>)});
});

主组件:

import React from "react";
import Intro from "./pages/Intro";
import Footer from "./components/Footer";
import Header from "./components/Header";

export default class Master extends React.Component {
    constructor() {
        super();
        this.state = {appStatus: 'INTRO'}
    }

    render() {
        let layout;
        switch (this.state.appStatus) {
            case "INTRO":
                layout = <Intro/>;
        }

        return (
            <div>
                <Header/>
                {layout}
                <Footer/>
            </div>
        )
    }
}

但是当我用 babel 运行服务器时,我得到了这个错误:

/assets/img/logo.png: Unexpected character '?' (1:0)

这是 Header 组件,它试图要求 Logo 。

import React from "react";
**import logo  from '../../assets/img/logo.png';**

export default class Header extends React.Component {
    constructor() {
        super();
    }

    render() {
        return (
            <nav class="navbar navbar-default">
                <div class="container-fluid">
                    <div class="navbar-header">
                        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                            <span class="sr-only">Toggle navigation</span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                        </button>
                        <a class="navbar-brand" href="#">**<img width="250" src={logo} alt=""/></a>**
                    </div>


                </div>
            </nav>
        );
    }
}

但是它在客户端的 webpack 上工作得很好..

最佳答案

你的服务器需要一个单独的 webpack 配置

  1. 安装此模块以排除 node_modules:

    npm install --save webpack-node-externals 
    
  2. 为您的服务器创建一个单独的 webpack 配置:

    module.exports = {    
      const path = require('path')
      const nodeExternals = require('webpack-node-externals')
    
      context: path.resolve(__dirname, 'directory of your server file'),
      entry: ['./filename of your server file'],
      output: {
        path: path.join(__dirname, 'directory of your bundled file'),
        filename: 'filename of your bundled file'
      },
      target: 'node',
      externals: [nodeExternals()],
      module: {
        rules: [
          {
            test: /\.(jpe?g|png|gif|svg|ico)$/i,
            use: 'url-loader?limit=8192'
          }
        ]
      }
    }
    
  3. 这是一个示例服务器 webpack.config.js:

    module.exports = {    
      const path = require('path')
      const nodeExternals = require('webpack-node-externals')
    
      context: path.resolve(__dirname, 'src'),
      entry: ['./index.js'],
      output: {
        path: path.join(__dirname, 'dist'),
        filename: 'bundle.js'
      },
      target: 'node',
      externals: [nodeExternals()],
      module: {
        rules: [
          {
            test: /\.(jpe?g|png|gif|svg|ico)$/i,
            use: 'url-loader?limit=8192'
          }
        ]
      }
    }
    
  4. 如果使用上面的 webpack.config.js 示例,运行 webpack 然后编译服务器文件:

    webpack
    node dist/bundle.js
    

关于javascript - 如何在服务器端渲染图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35659860/

相关文章:

javascript - self 评估 Javascript

node.js - 无法解析配置的 swagger-router 处理程序

javascript - Dropbox JS大量writeFile不写入所有文件

具有不同图像的 Javascript 计时器

javascript - 使用 D3 缩放到外部加载的 svg 上路径的边界框

javascript - 如何使用我可以推送到的方法和数组制作 Javascript 类?

javascript - 通过包含 HTML 的变量来检查特定单词

node.js - 在后端使用 Erlang + 一些其他语言

css - 通过将鼠标悬停在文本链接上来触发图像转换

ios - 关于 xcode Assets 目录和应用程序大小