如何为浏览器用户 gulp 和 tsproject 捆绑打字稿文件?

How to bundle typescript files for the browser user gulp and tsproject?

我是前端开发的新手,长期从事后端 C# 和 Java 开发,我正在努力掌握如何 build 前端应用程序。我想使用打字稿构建一个应用程序,并使用 gulp 作为我的构建管道,将我的代码转换、捆绑和缩小到单个 Java 脚本文件。

为此,我一直在研究节点模块 tsproject,据我所知,它应该完全符合我的要求。除了,我无法让它做我想做的事:-(。

这是我的相关部分 gulpfile.js:

var gulp = require('gulp');
var clean = require('gulp-clean');
var tsproject = require('tsproject');

gulp.task('default', [ 'min-js' ]);

gulp.task('clean', function () {
    return gulp
        .src('./dist/', { read: false })
        .pipe(clean());
});

gulp.task('min-js', [ 'clean' ], function () {
    return tsproject
        .src('./tsconfig.json')
        .pipe(gulp.dest('./dist/js'))
});

还有我的 tsconfig.json:

{
    "compilerOptions": {
        "sourceMap": true,
        "noImplicitAny": true,
        "module": "commonjs",
        "target": "es5",
        "jsx": "react",
        "outDir": "./"
    },
    "files": [
        "./src/**/*.tsx",
        "./src/**/*.ts"
    ],
    "bundles": {
        "myApp": {
            "files": [
                "./src/App.tsx"
            ],
            "config": {
                "minify": true,
                "sourcemap": true
            }
        }
    }
}

我原以为这会输出一个包含转译、捆绑和缩小的 js 文件 Java脚本代码,但我得到的是一个捆绑(未转译或缩小)的 Typescript 文件 (./dist/js/myApp.min.ts).

我是做错了什么还是完全误解了 tsproject 的目的和意图?

好吧,我不确定这是否是最好的方法,但我终于得到了像这样使用 gulpfile 的东西:

var gulp = require('gulp');
var browserify = require('gulp-browserify');
var clean = require('gulp-clean');
var concat = require('gulp-concat');
var sourcemaps = require('gulp-sourcemaps');
var ts = require('gulp-typescript');
var uglify = require('gulp-uglify');

gulp.task('default', [ 'min-js' ]);

gulp.task('clean', function () {
    return gulp
        .src([
            './tmp/',
            './dist/'
        ], { read: false })
        .pipe(clean());
});

gulp.task('transpile-ts', ['clean'], function () {
    var tsproject = ts.createProject('./src/tsconfig.json');
    return tsproject
        .src()
        .pipe(sourcemaps.init())
        .pipe(tsproject()).js
        .pipe(sourcemaps.write('./sourcemaps'))
        .pipe(gulp.dest('./tmp/js'));
});

gulp.task('min-js', [ 'transpile-ts' ], function () {
    return gulp
        .src('./tmp/js/App.js')
        .pipe(sourcemaps.init({ loadMaps: true }))
        .pipe(browserify())
        .pipe(uglify())
        .pipe(concat('App.min.js'))
        .pipe(sourcemaps.write('./sourcemaps'))
        .pipe(gulp.dest('./dist/js'))
});

基本上,我将所有 TypeScript 文件转译为 Javascript,并将 CommonJS 导入临时目录。然后我使用 Browserify 将 JavaScript 文件捆绑(即解析 CommonJS 导入)到一个文件中。最后我缩小了生成的 JavaScript 文件。瞧!

出于某种原因,我必须先将转换后的文件写入一个临时目录,然后将这些文件打包并缩小。而不是继续将 pipe(tsproject()) 的结果通过管道传输到 browserify()...

使用最新的 GULP 规范更新了 David Nordvall 的回答,该规范将任务设置为导出:

const gulp = require('gulp');
const {series} = require('gulp');
const clean = require('gulp-clean');
const ts = require('gulp-typescript');
const sourcemaps = require('gulp-sourcemaps');
const browserify = require('gulp-browserify');
const concat = require('gulp-concat');
const uglify = require('gulp-uglify');

function cleanAll(cb) {
  return gulp.src([
      "./tmp/",
      "./dist/"
    ], { read: false, allowEmpty: true })
    .pipe(clean());
}

function transpileTS() {
  const tsproject = ts.createProject('./tsconfig.json');
  return tsproject
      .src()
      .pipe(sourcemaps.init())
      .pipe(tsproject()).js
      .pipe(sourcemaps.write('./sourcemaps'))
      .pipe(gulp.dest('./tmp/js'));
}

function minJS() {
  return gulp
      .src('./tmp/js/App.js')
      .pipe(sourcemaps.init({ loadMaps: true }))
      .pipe(browserify())
      .pipe(uglify())
      .pipe(concat('App.min.js'))
      .pipe(sourcemaps.write('./sourcemaps'))
      .pipe(gulp.dest('./dist/js'))
}

exports.default = series( cleanAll, transpileTS, minJS );