Rocket.Chat WebHook 与 Typescript

4lx*_*ndr 8 javascript typescript rocket.chat

我即将为 Rocket.Chat 编写一个复杂的传入 WebHook。为了避免在单个文件中出现混乱,我使用了 Typescript。Rocket.Chat 需要一个Script用一些预定义方法命名的类process_incoming_request(一个简单的例子:https : //rocket.chat/docs/administrator-guides/integrations/ )。

我当前的项目设置如下所示:

配置文件

{
  "files": [
    "src/main.ts"
  ],
  "compilerOptions": {
    "noImplicitAny": true,
    "target": "es2015"
  }
}
Run Code Online (Sandbox Code Playgroud)

gulpfile.js

var gulp = require("gulp");
var browserify = require("browserify");
var source = require("vinyl-source-stream");
var tsify = require("tsify");
var uglify = require("gulp-uglify");
var buffer = require("vinyl-buffer");

gulp.task(
    "default",
    function () {
        return browserify({
            basedir: ".",
            debug: true,
            entries: ["src/main.ts"],
            cache: {},
            packageCache: {}
        })
            .plugin(tsify)
            .transform("babelify", {
                presets: ["es2015"],
                extensions: [".ts"]
            })
            .bundle()
            .pipe(source("bundle.js"))
            .pipe(buffer())
            .pipe(uglify())
            .pipe(gulp.dest("dist"));
    }
);
Run Code Online (Sandbox Code Playgroud)

主文件

import {RequestInterface} from "./Interface/RequestInterface";

class Script {
    process_incoming_request(request: RequestInterface) {
        // some code
    }
}
Run Code Online (Sandbox Code Playgroud)

yarn gulp过程运行顺利,没有错误,但是当在 webhook 的脚本部分使用生成的代码时,它会导致错误:

Incoming WebHook.error script.js:1   
ReferenceError: module is not defined       
at script.js:1:4307       
at Script.runInContext (vm.js:127:20)       
at Script.runInNewContext (vm.js:133:17)       
at getIntegrationScript (app/integrations/server/api/api.js:70:12)       
at Object.executeIntegrationRest (app/integrations/server/api/api.js:166:13)       
at app/api/server/api.js:343:82       
at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js:1234:12)       
at Object._internalRouteActionHandler [as action] (app/api/server/api.js:343:39)       
at Route.share.Route.Route._callEndpoint (packages/nimble_restivus/lib/route.coffee:150:32)       
at packages/nimble_restivus/lib/route.coffee:59:33 
Run Code Online (Sandbox Code Playgroud)

我对 Typescript、Node 和所有东西都不太熟悉。所以主要问题是,我如何才能实现该过程生成一个以Script方法命名的类(或一个公开类的脚本)process_incoming_request。我也不确定我的脚本是生成错误还是 RocketChat 部分。

谢谢!

Eug*_*e M 2

我猜问题是 Gulp(或者它的一些插件)生成了一个脚手架代码,这是 JS(不存在的)模块系统所必需的,并且它通常意味着将编译器输出包装成奇怪的多层匿名函数。

如果你不需要任何类型的模块系统,只想将多个 TS 文件直接转换为单个 JS 文件(据说会转到 RocketChat),那么我建议完全放弃 Gulp,让 TSC 将你的代码编译为通常,然后.js使用脚本将生成的文件捆绑到一个文件中。

因此,整体设置如下(假设src是源代码文件夹):

tsconfig.json

{
  "include": [
    "src/**/*.ts"
  ],
  "compilerOptions": {
    "noImplicitAny": true,
    "target": "es2016"
  }
}
Run Code Online (Sandbox Code Playgroud)

构建.sh

{
  "include": [
    "src/**/*.ts"
  ],
  "compilerOptions": {
    "noImplicitAny": true,
    "target": "es2016"
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,您像往常一样对您的东西进行编程,使用 构建它./build.sh,获取dist/app.js文件并在 RocketChat 中使用它。

必须有一种方法可以在 Gulp 中按照这些思路做一些事情,但我不熟悉它,并且不认为这里真正需要一个成熟的构建系统。