网站搜索

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

找到了解决方案

  1. 我们有一些 ES6+ 模块,它们可能自身包含其他导入语句。

     let nodeStart = () => {
         return "ES6+ module";
     }
    
     export default nodeStart;
    
  2. 使用 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: {
                       
                    }
                })
            ]        
        }
    };
  1. 在 packages.json 中创建用于 webpack 的脚本并运行它。

  2. “some-module-node.js” 将被生成。

  3. 将 "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
    
  4. 从 .net core 运行

      var test = await StaticNodeJSService.InvokeFromFileAsync<string> 
      ("Scripts/server-test/start-node.js", args: new object[] {  });
    

test 将是 "ES6+ 模块"

相关文章