@luban-cli/cli-plugin-service
Version:
A development runtime environment dependency
91 lines • 4.1 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.render = exports.generateDocument = void 0;
const server_1 = __importDefault(require("react-dom/server"));
const react_helmet_1 = __importDefault(require("react-helmet"));
const ejs_1 = __importDefault(require("ejs"));
const serialize_javascript_1 = __importDefault(require("serialize-javascript"));
const serverBundle = require("./server-bundle.js");
const template = require("./server_template.js");
const assetsManifestJson = require("./asset-manifest.json");
const generateInjectedTag = (assetsManifest, path) => {
const injectedStyles = [];
const injectedScripts = [];
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
*/
exports.generateDocument = (template, context, App, injectedScripts, injectedStyles) => {
let document = "";
if (App) {
const content = server_1.default.renderToString(App);
const helmet = react_helmet_1.default.renderStatic();
document = ejs_1.default.render(template, {
CONTENT: content,
__INITIAL_DATA__: serialize_javascript_1.default(context.initProps),
__USE_SSR__: true,
__INITIAL_STATE__: serialize_javascript_1.default(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;
};
function render(options) {
return __awaiter(this, void 0, void 0, function* () {
const context = {
url: options.url || "/",
path: options.path || "/",
initProps: {},
initState: {},
query: options.query || {},
};
const staticRouterContext = {
location: Object.assign({ pathname: options.path || "/" }, (options.cachedLocation || {})),
};
const store = typeof serverBundle.createStore === "function"
? serverBundle.createStore(options.cachedState || {})
: null;
const App = yield serverBundle.default(context, staticRouterContext, store, options.shared || {});
const { injectedStyles, injectedScripts } = generateInjectedTag(assetsManifestJson, options.path || "/");
const document = exports.generateDocument(template, context, App, injectedScripts, injectedStyles);
return { document, staticRouterContext };
});
}
exports.render = render;
//# sourceMappingURL=server.js.map