1.2.3 ā€¢ Published 4 years ago

umi-server v1.2.3

Weekly downloads
276
License
MIT
Repository
github
Last release
4 years ago

umi-server

codecov NPM version NPM downloads CircleCI GitHub Actions status

šŸš€ A runtime render tool for Umijs Server-Side Rendering.

Quick Start

(config + ctx) => htmlString

npm install umi-server -S
const server = require('umi-server');
const http = require('http');
const { createReadStream } = require('fs');
const { join, extname } = require('path');

const root = join(__dirname, 'dist');
const render = server({
  root,
})
const headerMap = {
  '.js': 'text/javascript',
  '.css': 'text/css',
  '.jpg': 'image/jpeg',
  '.png': 'image/jpeg',
}

http.createServer(async (req, res) => {
  const ext = extname(req.url);
  const header = {
    'Content-Type': headerMap[ext] || 'text/html'
  }
  res.writeHead(200, header);

  if (!ext) {
    // url render
    const ctx = {
      req,
      res,
    }
    const { ssrHtml } = await render(ctx);
    res.write(ssrHtml);
    res.end()
  } else {
    // static file url
    const path = join(root, req.url);
    const stream = createReadStream(path);
    stream.on('error', (error) => {
      res.writeHead(404, 'Not Found');
      res.end();
    });
    stream.pipe(res);
  }

}).listen(3000)

console.log('http://localhost:3000');

Visit http://localhost:3000.

Usage

First, you need require/import umi-server.

const server = require('umi-server');
// ES6 / TypeScript
import server from 'umi-server';

Enable SSR config

set ssr: true in Umi's configuration file.

// .umirc.js
export default {
+  ssr: true
}

then run umi build to generate the files by default:

.
ā”œā”€ā”€ dist
ā”‚Ā Ā  ā”œā”€ā”€ index.html
ā”‚Ā Ā  ā”œā”€ā”€ ssr-client-mainifest.json
ā”‚Ā Ā  ā”œā”€ā”€ umi.js
ā”‚Ā Ā  ā””ā”€ā”€ umi.server.js
ā””ā”€ā”€ pages
    ā””ā”€ā”€ index.js

Initialize render

You need to configure the resources needed for SSR.

server(options)

const server = require('umi-server');
const render = server({
  // you should make sure that `umi.server.js` and `ssr-client-mainifest.json` in the same location.
  root: join(__dirname, 'dist'),
});

Client utils

umi-server provide the following utils like isBrowser:

import React from 'react';
import { isBrowser } from 'umi-server';

export default () => {
  const env = isBrowser() ? 'client' : 'server';
  return (
    <p>current env {env}</p>
  )
}

options

ParameterDescriptionTypeOptional ValueDefault
rootprefix path for filename and manifest, if both in the same directorystring--undefined
filenameumi ssr server-side filestring--${root}/umi.server.js
manifestumi ssr manifest filestring--${root}/ssr-client-mainifest.json
devwhether in development envboolean--process.env.NODE_ENV === 'development'
polyfillwhether use polyfill for server-renderboolean{ host: string }--false
staticMarkupuse renderToStaticMarkupboolean--false
postProcessHtmlhandler function for user to modify render html accounding cheerio($, args) => $Array--$ => $
customRendercustom Render function(IResult) => Promise--ReactDOMServer.renderToString
streamuse renderToNodeStream, better perfBoolean--false

render Component/Page

server-side render using current req.url to match the current page or component.

Result = render(ctx, renderOpts)

(req, res) => {
  const ctx = {
    req: {
      url: req.url,
    },
    res,
  }
  const { ssrHtml } = await render(ctx);
  res.write(ssrHtml);
}

Custom Render

umi-server supports custom render function by user. see ssr-customRender/index.test.ts.

ctx

the request and reponse render context, req and res will pass down into getInitialProps.

ParameterDescriptionTypeOptional ValueDefault
reqhttp Request obj, must include urlRequest--undefined
reshttp Reponse obj--

renderOpts

the render runtime opts like default polyfill for different pages.

ParameterDescriptionTypeOptional ValueDefault
polyfillsame as the options#polyfill--false
runInMockContextruntime global object mock, for mock window.location, etc.--false

more example usages in test cases.

TODO

  • Serverless
  • Support stream render
  • Support react-helmet and react-document-title handler
  • Better performance
1.2.3

4 years ago

1.2.2

4 years ago

1.2.1

4 years ago

1.2.0

4 years ago

1.1.9

4 years ago

1.1.8

4 years ago

1.1.7

5 years ago

1.1.6

5 years ago

1.1.5

5 years ago

1.1.4

5 years ago

1.1.3

5 years ago

1.1.2

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.4

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago

0.0.2

5 years ago

0.0.1

5 years ago