Skip to content

Commit

Permalink
fix(cli-plugin-service): not require 'generateInjectedTag' and 'gener…
Browse files Browse the repository at this point in the history
…ateDocument'
  • Loading branch information
front-end-captain committed Jun 1, 2021
1 parent 4af3b81 commit d27e76a
Showing 1 changed file with 68 additions and 2 deletions.
70 changes: 68 additions & 2 deletions packages/@luban/cli-plugin-service/src/utils/server.ts
@@ -1,15 +1,81 @@
/* eslint-disable @typescript-eslint/no-var-requires */
import { StaticRouterContext } from "react-router";
import ReactDOMServer from "react-dom/server";
import Helmet from "react-helmet";
import ejs from "ejs";
import serialize from "serialize-javascript";

import { ServerBundle } from "../definitions";
import { GenerateDocument } from "./generateDocument";
import { GenerateInjectedTag } from "./generateInjectedHtmlTag";

const generateInjectedTag: GenerateInjectedTag = require("./generateInjectedHtmlTag.js");
const generateDocument: GenerateDocument = require("./generateDocument.js");
const serverBundle: ServerBundle = require("./server-bundle.js");
const template: string = require("./server_template.js");
const assetsManifestJson: Record<string, string> = require("./asset-manifest.json");

const generateInjectedTag: GenerateInjectedTag = (assetsManifest, path) => {
const injectedStyles: string[] = [];
const injectedScripts: string[] = [];

const noSlashPath = path.split("/").join("-");

Object.keys(assetsManifest).forEach((item) => {
const ext = item.substring(item.lastIndexOf("."));

if (item.includes(noSlashPath)) {
if (ext === ".js") {
injectedScripts.push(`<script src="${assetsManifest[item]}"></script>`);
}

if (ext === ".css") {
injectedStyles.push(`<link href="${assetsManifest[item]}" rel="stylesheet">`);
}
}
});

return { injectedStyles, injectedScripts };
};

/**
* generate html document
* @param template
* @param context
* @param App
* @param injectedScripts
* @param injectedStyles
*/
export const generateDocument: GenerateDocument = (
template,
context,
App,
injectedScripts,
injectedStyles,
) => {
let document = "";

if (App) {
const content = ReactDOMServer.renderToString(App);

const helmet = Helmet.renderStatic();

document = ejs.render(template, {
CONTENT: content,
__INITIAL_DATA__: serialize(context.initProps),
__USE_SSR__: true,
__INITIAL_STATE__: serialize(context.initState),
INJECTED_STYLES: injectedStyles,
INJECTED_SCRIPTS: injectedScripts,
link: helmet.link.toString(),
meta: helmet.meta.toString(),
script: helmet.script.toString(),
style: helmet.style.toString(),
title: helmet.title.toString(),
});
}

return document;
};

interface RenderOptions {
url?: string;
path?: string;
Expand Down

0 comments on commit d27e76a

Please sign in to comment.