fgnass / domino

Server-side DOM implementation based on Mozilla's dom.js
BSD 2-Clause "Simplified" License
764 stars 118 forks source link

using domino in express server #140

Closed xxyyzz2050 closed 5 years ago

xxyyzz2050 commented 5 years ago

I run my server using 'express', so I already set the template with express:


app.set("view engine", "html");
app.set("views", DIST_FOLDER);

and then I create the template again with domino to implement the DOM

const template = readFileSync(join(DIST_FOLDER, "/index.html")).toString();
const win = domino.createWindow(template);

is it ok to create the template twice? once with express and another with domino?

xxyyzz2050 commented 5 years ago

here is my full server.ts file (angular universal with express)

const DIST_FOLDER = join(process.cwd(), "dist/browser");

//https://mdbootstrap.com/support/angular/angular-universal-with-mdboostrap-not-working/
import { readFileSync } from "fs";
const domino = require("domino"); //Server-side DOM implementation based on Mozilla's dom.js
const template = readFileSync(join(DIST_FOLDER, "/index.html")).toString();
const win = domino.createWindow(template);
global["window"] = win;
global["Node"] = win.Node;
global["navigator"] = win.navigator;
global["Event"] = win.Event;
global["Event"]["prototype"] = win.Event.prototype;
global["document"] = win.document;

//-------------------

import "zone.js/dist/zone-node";
import "reflect-metadata";
import { enableProdMode } from "@angular/core";
// Express Engine
import { ngExpressEngine } from "@nguniversal/express-engine";
// Import module map for lazy loading
import { provideModuleMap } from "@nguniversal/module-map-ngfactory-loader";

import * as express from "express";
import { join } from "path";

// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();

// Express server
const app = express();

const PORT = process.env.PORT || 4000;

// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const {
  AppServerModuleNgFactory,
  LAZY_MODULE_MAP
} = require("./dist/server/main");

// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine(
  "html",
  ngExpressEngine({
    bootstrap: AppServerModuleNgFactory,
    providers: [provideModuleMap(LAZY_MODULE_MAP)]
  })
);

app.set("view engine", "html");
app.set("views", DIST_FOLDER);

// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });
// Server static files from /browser
app.get(
  "*.*",
  express.static(DIST_FOLDER, {
    maxAge: "1y"
  })
);

// All regular routes use the Universal engine
app.get("*", (req, res) => {
  res.render("index", { req });
});

// Start up the Node server
app.listen(PORT, () => {
  console.log(`Node Express server listening on http://localhost:${PORT}`);
});
cscott commented 5 years ago

You're actually using angular here, express is just the web server. You should file this bug over in the angular project.