Skip to content

Commit a4edde0

Browse files
Support native node require to load modules
1 parent 08d3dd3 commit a4edde0

File tree

6 files changed

+75
-30
lines changed

6 files changed

+75
-30
lines changed

src/React.NodeServices/NodeJsEngine.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@ private NodeJsEngine(INodeJSService nodeJSService)
1919
_nodeJSService = nodeJSService;
2020
}
2121

22-
private string WrapAsModule(string code) => $"let wrappedCode = () => vm.runInContext({JsonConvert.SerializeObject(code, _settings)}, vmContext ); module.exports = function(callback, message) {{ callback(null, wrappedCode()); }}";
22+
private string WrapAsModule(string code) => $@"
23+
let wrappedCode = () => vm.runInThisContext({JsonConvert.SerializeObject(code, _settings)});
24+
25+
module.exports = function(callback, message) {{
26+
callback(null, wrappedCode());
27+
}}";
2328

2429
public static INodeJsEngine CreateEngine(INodeJSService nodeJSService)
2530
{
26-
var engine = new NodeJsEngine(nodeJSService);
27-
engine._nodeJSService.InvokeFromStringAsync("let wrappedCode = () => { global.vmContext = {}; vm.createContext(global.vmContext); }; module.exports = function(callback, message) {{ callback(null, wrappedCode()); }}").ConfigureAwait(false).GetAwaiter().GetResult();
28-
return engine;
31+
return new NodeJsEngine(nodeJSService);
2932
}
3033

3134
public string Name => throw new NotImplementedException();
@@ -59,8 +62,7 @@ public void Execute(string code)
5962

6063
public void ExecuteFile(IFileSystem fileSystem, string path)
6164
{
62-
var contents = fileSystem.ReadAsString(path);
63-
Execute(contents);
65+
_nodeJSService.InvokeFromStringAsync(WrapAsModule($"require(path.resolve({JsonConvert.SerializeObject(fileSystem.MapPath(path), _settings)}));")).ConfigureAwait(false).GetAwaiter().GetResult();
6466
}
6567

6668
public void ExecuteResource(string resourceName, Assembly assembly)

src/React.Sample.Webpack.CoreMvc/Content/components/expose-components.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ global.EmotionServer = { renderStylesToString };
1818
global.Helmet = Helmet;
1919

2020
global.RootComponent = RootComponent;
21+
22+
export default (resolve) => resolve();

src/React.Sample.Webpack.CoreMvc/Startup.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ public void Configure(IApplicationBuilder app)
4848
.SetLoadBabel(false)
4949
.SetLoadReact(false)
5050
.SetNodeJsEngine(() => NodeJsEngine.CreateEngine(app.ApplicationServices.GetService<INodeJSService>()))
51-
.AddScriptWithoutTransform("~/dist/runtime.js")
52-
.AddScriptWithoutTransform("~/dist/vendor.js")
53-
.AddScriptWithoutTransform("~/dist/components.js");
51+
.AddScriptWithoutTransform("~/server/dist/components.js");
5452
});
5553

5654
app.UseStaticFiles();

src/React.Sample.Webpack.CoreMvc/package-lock.json

Lines changed: 41 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/React.Sample.Webpack.CoreMvc/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"main": "index.js",
55
"license": "MIT",
66
"scripts": {
7-
"build": "webpack"
7+
"build": "rimraf wwwroot/dist && rimraf wwwroot/server && webpack"
88
},
99
"dependencies": {
1010
"emotion": "^9.2.12",
@@ -17,6 +17,7 @@
1717
"react-router-dom": "^5.0.0",
1818
"react-select": "^3.0.4",
1919
"reactstrap": "^8.0.0",
20+
"rimraf": "^3.0.1",
2021
"styled-components": "^4.0.0"
2122
},
2223
"devDependencies": {

src/React.Sample.Webpack.CoreMvc/webpack.config.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
const path = require('path');
22

3-
module.exports = {
3+
const bundle = {
44
entry: {
55
components: './Content/components/expose-components.js',
66
},
7+
devtool: 'sourcemap',
78
output: {
89
filename: '[name].js',
910
globalObject: 'this',
@@ -35,3 +36,22 @@ module.exports = {
3536
],
3637
},
3738
};
39+
40+
module.exports = [
41+
{
42+
...bundle,
43+
target: 'web'
44+
},
45+
{
46+
devtool: bundle.devtool,
47+
entry: bundle.entry,
48+
mode: bundle.mode,
49+
module: bundle.module,
50+
target: 'node',
51+
output: {
52+
...bundle.output,
53+
path: path.resolve(__dirname, 'wwwroot/server/dist'),
54+
libraryTarget: 'commonjs',
55+
},
56+
}
57+
]

0 commit comments

Comments
 (0)