c# - 如何使用 Jering.Javascript.NodeJS 通过 .net core 和 nodejs 运行 TypeScript ES6+ 服务器端
我想在服务器端运行用 ES2020 编写的一些 TypeScript 代码。目前我正在运行一个 ASP.NET Core 应用程序,所以想法是通过 Jering.Javascript.NodeJS 和 nodejs 运行 js。
所以从一个基本的例子开始。
var test = await StaticNodeJSService.InvokeFromFileAsync<string>("Scripts/server/modules/hello.ts", args: new object[] { });
hello.ts
module.exports = (callback, x, y) => { // Module must export a function that takes a callback as its first parameter
var result = "test"; // Your javascript logic
callback(null /* If an error occurred, provide an error object or message */, result); // Call the callback when you're done.
}有效……添加了一些导入语句……
你好.ts
import someFunction from "./some.func";
module.exports = (callback, x, y) => { // Module must export a function that takes a callback as its first parameter
var result = "test"; // Your javascript logic
callback(null /* If an error occurred, provide an error object or message */, result); // Call the callback when you're done.
}--> "在模块外无法使用 import 语句"
Nodejs 版本 v16.13.2,并且在 package.json 中已经设置
"type": "module"
更改为要求
你好.ts
const someFunction = require("./some.func")
module.exports = (callback, x, y) => { // Module must export a function that takes a callback as its first parameter
var result = "test"; // Your javascript logic
callback(null /* If an error occurred, provide an error object or message */, result); // Call the callback when you're done.
}导致“InvocationException: 不支持从...使用 require() 导入 ES 模块...。请将...中 some.func.js 的 require 改为在所有 CommonJS 模块中可用的动态 import()”
有点像无限循环。
看这里似乎是可能的,但我该如何让它运行呢?
答案#1
找到了解决方案
我们有一些 ES6+ 模块,它们可能自身包含其他导入语句。
let nodeStart = () => { return "ES6+ module"; } export default nodeStart;使用 webpack 和 babel 将 ES6+ 转换为 commonjs
webpack.config.js
const path = require('path');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
module.exports = (env, options) => {
console.log(`Webpack 'mode': ${options.mode}`);
var isDev = options.mode === 'development';
return {
entry: {
'some-module-node': "./Scripts/server-test/some-module.ts",
},
output: {
filename: '[name].js',
path: path.resolve(__dirname, "Scripts/server-test"),
libraryTarget: 'commonjs'
},
module: {
rules: [
{
test: /\.tsx?$/,
loader: 'ts-loader',
exclude: file => (
/node_modules/.test(file
))
},
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
['@babel/preset-env', {
modules: false,
useBuiltIns: 'usage'
}]
]
}
}
}
]
},
resolve: {
extensions: [".ts", ".js"]
},
target: 'node',
devtool: isDev ? "source-map" : undefined,
plugins: [
new ForkTsCheckerWebpackPlugin({
typescript: {
}
})
]
}
};
在 packages.json 中创建用于 webpack 的脚本并运行它。
“some-module-node.js” 将被生成。
将 "start-node.js" 用作 "Jering.Javascript.NodeJS" 的入口点
const someModule=require('./some-module-node.js')
function start(callback, x) { // Module must export a function that takes a callback as its first parameter var result = someModule.default() callback(null /* If an error occurred, provide an error object or message */, result); // Call the callback when you're done. } module.exports = start从 .net core 运行
var test = await StaticNodeJSService.InvokeFromFileAsync<string> ("Scripts/server-test/start-node.js", args: new object[] { });
test 将是 "ES6+ 模块"
