【问题标题】:Gulp + Browserify + TypeScript To BrowserGulp + Browserify + TypeScript 到浏览器
【发布时间】:2017-09-25 16:15:18
【问题描述】:

我的问题如下:

我使用 gulp+browserify 将我的 TypeScript 编译为可以在普通 HTML 页面上使用的 JavaScript,问题是我的类在浏览器上永远不可用:

VM633:1 Uncaught ReferenceError: Test is not defined
    at <anonymous>:1:13

这是我的 TypeScript 文件:

class Test {
        public test(): void {
            console.log("aa");
        }
}

这是我的 gulpfile

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

gulp.task("default", function () {
    return browserify({
        //basedir: '.',
        debug: true,
        entries: ['app/Resources/typescript/Test.ts'],
        cache: {},
        packageCache: {}
    })
        .plugin(tsify)
        .bundle()
        .pipe(source('bundle.js'))
        .pipe(gulp.dest("web/bundles/framework/js"));
});

文件编译没有问题,并且包含在我的index.html(编译好的js文件)中。

但是当我尝试时:

 var t = new Test();

我收到以下错误:

VM633:1 Uncaught ReferenceError: Test is not defined
    at <anonymous>:1:13

我无法解决它,我已经阅读了很多但我没有发现任何清楚的东西,我尝试了所有但没有任何效果。

【问题讨论】:

    标签: node.js typescript gulp browserify


    【解决方案1】:

    这里缺少一些东西:

    如果您希望您的课程可以在您的模块之外访问,您必须export it:

    export class Test {
        // ...
    }
    

    Browserify 在您定义的类之上创建函数。所以它将无法在全球范围内访问(这是一件好事)。通常你会将它导入另一个文件并使用它:

    // in any TS file that wants to use `Test` class. Make sure this is included in the gulp entries as well
    import {Test} from "test";
    var t = new Test();
    console.log(t);
    

    或者如果真的希望它可以全局访问,你可以将它附加到window对象:

    //在Test.ts文件中:

    (window as any).Test = Test; // This can be useful when debuging. But don't do this in production code.
    

    【讨论】:

    • 谢谢,我用export试过了,但是不行,我想在我的index.html中使用我的Class,这可能吗?或者我应该在我的 ts 类中与 html 交互而不是在 html 中导入该类?
    • 我不认为你可以单独使用 Browserify 来转换 html 中的 JS。您可能必须使用plugin like this。或者,如果您已将类设置为 wiindow 对象,如上所示,您可以从任何地方访问它。
    • 但是我的想法是用TypeScript开发javascript,并在我的index.html中使用它就像JavaScript一样,有什么问题?为什么我不能使用编译后的 TypeScript,我不明白,它和其他 JS 一样是纯 JavaScript。谢谢!
    • 看到生成的JS就明白了。您创建的类未放在全局范围内。它被限定在一个模块函数中。
    • 是的,我看到了,它是一个匿名函数,难道没有办法导入那个模块吗?或者编译器我不会模块?并使用类?