使用普通 JavaScript 从 asp.net MCV 页面调用 Browserify TypeScript 包
Calling a Browserify TypeScript bundle from asp.net MCV page using plain JavaScript
我有一个 asp.net,我有一个 MVC 应用程序,我想在其中添加一些使用 TypeScript 的客户端处理,并从 a.cshtml 文件调用它(只使用普通的 JavaScript在此页面内)。我正在使用 Gulp 和 Browserify
进行捆绑
我有以下 gulp 文件
/*
Use gulp --production to minimize and skip source maps
This skips the bundling jquery , so need to include this before the bundle
*/
// Pass this to build in production
var PRODUCTION_ARG = "production";
// Itellisense related defines
var INTELLISENSE_SRC_FOLDER = "UserControls/Intellisense/src";
var INTELLISENSE_DEST_FOLDER = "UserControls/Intellisense/build";
var INTELLISENSE_BUNDLE_FILENAME = "intellisense-bundle.js";
var gulp = require('gulp');
var del = require('del');
var ts = require("gulp-typescript");
var tsProject = ts.createProject("tsconfig.json");
var browserify = require("browserify");
var source = require('vinyl-source-stream');
var tsify = require("tsify");
var uglify = require('gulp-uglify');
var buffer = require('vinyl-buffer');
var argv = require('yargs').argv;
gulpif = require('gulp-if');
gulp.task('intellisense-clean', function () {
return del([INTELLISENSE_DEST_FOLDER + '/**/*']);
});
gulp.task("intellisense-copy-html", function () {
return gulp.src(INTELLISENSE_SRC_FOLDER + "/*.html")
.pipe(gulp.dest(INTELLISENSE_DEST_FOLDER));
});
gulp.task("intellisense-copy-css", function () {
return gulp.src(INTELLISENSE_SRC_FOLDER + "/*.css")
.pipe(gulp.dest(INTELLISENSE_DEST_FOLDER));
});
gulp.task("build-intellisense", ["intellisense-clean", "intellisense-copy-html", "intellisense-copy-css"], function () {
return browserify({
basedir: '.',
debug: true,
standalone: 'ABC',
entries: [INTELLISENSE_SRC_FOLDER + '/intellinode.ts',
INTELLISENSE_SRC_FOLDER + '/code-description-pair.ts',
INTELLISENSE_SRC_FOLDER + '/console-logger.ts',
INTELLISENSE_SRC_FOLDER + '/intellisense-control.ts'],
cache: {},
packageCache: {},
})
.ignore('jquery')
.plugin(tsify)
.bundle()
.pipe(source(INTELLISENSE_BUNDLE_FILENAME))
.pipe(buffer())
.pipe(gulpif(argv.production, uglify()))
.pipe(gulp.dest(INTELLISENSE_DEST_FOLDER));
});
gulp.task("default", ["build-intellisense"], function () {
});
我的tsconfig.json如下..
{
"compilerOptions": {
"noImplicitAny": true,
"noEmitOnError": true,
"removeComments": false,
"sourceMap": true,
"target": "es3",
"module": "commonjs"
},
"target": "es3",
"files": [
"./UserControls/Intellisense/src/*.ts"
],
"exclude": [
"node_modules",
"wwwroot"
],
"compileOnSave": true
}
第一个奇怪的事情是我似乎需要将每个 ts 文件包含在 entries:
列表中以调用 browserify,否则我似乎只包含 类 中的一个或两个在输出包文件中。
所以,包括它们似乎都有效(虽然想知道为什么需要它们而不只是 "top level" 一个。
下一个问题是我想从普通浏览器 JavaScript 实例化和调用一些方法。从其他帖子中得知,我可以像上面那样使用 standalone: 'Intellisense'
标志。然后添加一个全局对象 "ABC" (我可以看到 int eh 调试器)但似乎只包含一个 TypeScript 类 (实际上是条目列表中的最后一个)
我已将 tsconfig 模块更改为 amd
但出现其他错误(因此改回 commonjs
)。
真不知道该何去何从。似乎将 TypeScript 世界与普通浏览器世界结合起来非常有限 JavaScript 世界。
如有任何帮助,我们将不胜感激!
据我所知,Browerify 捆绑的任何内容都不能在其中捆绑的内容之外访问,即任何人都可以访问 none 的导出external JavaScript (这就是我在问题中实际提出的问题)。 Browerify 只是让包中的东西在浏览器中工作。
因此,要在外部公开我的 class(es),您只需向全局 space 添加一个对象,然后向其中添加任何内容...
例如在 TS 文件中有
(function () {
let w: any = window;
w.TSModule = {};
w.TSModule.CreateClassToExport = function() {
return new ClassToExport();
}
})();
export class ClassToExport {
public doWork() : void{
...
}
并在 .cshtml
JavaScript 中包含捆绑包并按以下方式访问此对象...
var myExport = TSModule.CreateClassToExport();
myExport.doWork();
是的,这给全局添加了一些东西 space,我知道这很糟糕,但它只是一个对象。
如果有更好的解决方案,我仍然很感兴趣,但至少我现在可以使用我的 TS 代码了。
我有一个 asp.net,我有一个 MVC 应用程序,我想在其中添加一些使用 TypeScript 的客户端处理,并从 a.cshtml 文件调用它(只使用普通的 JavaScript在此页面内)。我正在使用 Gulp 和 Browserify
进行捆绑我有以下 gulp 文件
/*
Use gulp --production to minimize and skip source maps
This skips the bundling jquery , so need to include this before the bundle
*/
// Pass this to build in production
var PRODUCTION_ARG = "production";
// Itellisense related defines
var INTELLISENSE_SRC_FOLDER = "UserControls/Intellisense/src";
var INTELLISENSE_DEST_FOLDER = "UserControls/Intellisense/build";
var INTELLISENSE_BUNDLE_FILENAME = "intellisense-bundle.js";
var gulp = require('gulp');
var del = require('del');
var ts = require("gulp-typescript");
var tsProject = ts.createProject("tsconfig.json");
var browserify = require("browserify");
var source = require('vinyl-source-stream');
var tsify = require("tsify");
var uglify = require('gulp-uglify');
var buffer = require('vinyl-buffer');
var argv = require('yargs').argv;
gulpif = require('gulp-if');
gulp.task('intellisense-clean', function () {
return del([INTELLISENSE_DEST_FOLDER + '/**/*']);
});
gulp.task("intellisense-copy-html", function () {
return gulp.src(INTELLISENSE_SRC_FOLDER + "/*.html")
.pipe(gulp.dest(INTELLISENSE_DEST_FOLDER));
});
gulp.task("intellisense-copy-css", function () {
return gulp.src(INTELLISENSE_SRC_FOLDER + "/*.css")
.pipe(gulp.dest(INTELLISENSE_DEST_FOLDER));
});
gulp.task("build-intellisense", ["intellisense-clean", "intellisense-copy-html", "intellisense-copy-css"], function () {
return browserify({
basedir: '.',
debug: true,
standalone: 'ABC',
entries: [INTELLISENSE_SRC_FOLDER + '/intellinode.ts',
INTELLISENSE_SRC_FOLDER + '/code-description-pair.ts',
INTELLISENSE_SRC_FOLDER + '/console-logger.ts',
INTELLISENSE_SRC_FOLDER + '/intellisense-control.ts'],
cache: {},
packageCache: {},
})
.ignore('jquery')
.plugin(tsify)
.bundle()
.pipe(source(INTELLISENSE_BUNDLE_FILENAME))
.pipe(buffer())
.pipe(gulpif(argv.production, uglify()))
.pipe(gulp.dest(INTELLISENSE_DEST_FOLDER));
});
gulp.task("default", ["build-intellisense"], function () {
});
我的tsconfig.json如下..
{
"compilerOptions": {
"noImplicitAny": true,
"noEmitOnError": true,
"removeComments": false,
"sourceMap": true,
"target": "es3",
"module": "commonjs"
},
"target": "es3",
"files": [
"./UserControls/Intellisense/src/*.ts"
],
"exclude": [
"node_modules",
"wwwroot"
],
"compileOnSave": true
}
第一个奇怪的事情是我似乎需要将每个 ts 文件包含在 entries:
列表中以调用 browserify,否则我似乎只包含 类 中的一个或两个在输出包文件中。
所以,包括它们似乎都有效(虽然想知道为什么需要它们而不只是 "top level" 一个。
下一个问题是我想从普通浏览器 JavaScript 实例化和调用一些方法。从其他帖子中得知,我可以像上面那样使用 standalone: 'Intellisense'
标志。然后添加一个全局对象 "ABC" (我可以看到 int eh 调试器)但似乎只包含一个 TypeScript 类 (实际上是条目列表中的最后一个)
我已将 tsconfig 模块更改为 amd
但出现其他错误(因此改回 commonjs
)。
真不知道该何去何从。似乎将 TypeScript 世界与普通浏览器世界结合起来非常有限 JavaScript 世界。
如有任何帮助,我们将不胜感激!
据我所知,Browerify 捆绑的任何内容都不能在其中捆绑的内容之外访问,即任何人都可以访问 none 的导出external JavaScript (这就是我在问题中实际提出的问题)。 Browerify 只是让包中的东西在浏览器中工作。
因此,要在外部公开我的 class(es),您只需向全局 space 添加一个对象,然后向其中添加任何内容...
例如在 TS 文件中有
(function () {
let w: any = window;
w.TSModule = {};
w.TSModule.CreateClassToExport = function() {
return new ClassToExport();
}
})();
export class ClassToExport {
public doWork() : void{
...
}
并在 .cshtml
JavaScript 中包含捆绑包并按以下方式访问此对象...
var myExport = TSModule.CreateClassToExport();
myExport.doWork();
是的,这给全局添加了一些东西 space,我知道这很糟糕,但它只是一个对象。
如果有更好的解决方案,我仍然很感兴趣,但至少我现在可以使用我的 TS 代码了。