An ASP.NET MVC (MVC Core 1, MVC 6) ViewEngine for rendering markup in a javascript environment. Ideal for React and Angular server-side rendering.
The main drive behind this is to support isomorphic/universal rendering. The idea is that your Model
will be passed to a javascript method that will render markup in return. Imagine having a react component tree that is hydrated via a single immutable JSON structure, representing the initial state of the service-side rendered page.
There were existing projects out there that allowed us to render javascript. All of them had their issues.
Checkout the JavaScriptViewEngine.Samples repo!
Or, checkout the react-aspnet-boilerplate.
Getting started is pretty simple.
JavaScriptViewEngine
NuGet package.Startup.cs
.public class Startup { private readonly IHostingEnvironment _env; public Startup(IHostingEnvironment env) { _env = env; } public void ConfigureServices(IServiceCollection services) { services.AddJsEngine(); services.Configure<RenderPoolOptions>(options => { options.WatchPath = _env.WebRootPath; options.WatchFiles = new List<string> { Path.Combine(options.WatchPath, "default.js") }; }); services.AddMvc(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app) { app.UseJsEngine(); // this needs to be before MVC app.UseMvc(routes => { routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); }); } }
default.js
in your WebRootPath
that will be invoked when rendering.module.exports = { renderView: function (callback, path, model, viewBag, routeValues) { callback(null, { html: "<html><head></head><body><p><strong>Model:</strong> " + JSON.stringify(model) + "</p><p><strong>ViewBag:</strong> " + JSON.stringify(viewBag) + "</p></body>", status: 200, redirect: null }); }, renderPartialView: function (callback, path, model, viewBag, routeValues) { callback(null, { html: "<p><strong>Model:</strong> " + JSON.stringify(model) + "</p><p><strong>ViewBag:</strong> " + JSON.stringify(viewBag) + "</p>" }); } };
public class HomeController : Controller { public IActionResult Index(string greeting = "Hello word!") { return View(new GreetingViewModel { Greeting = greeting }); } } public class GreetingViewModel { public string Greeting { get; set; } }
This project uses Cake for building: http://cakebuild.net/
From a Powershell prompt: PS> ./build.ps1
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4