用GULP为ANGING生成打字稿

kt06eoxx  于 2022-10-24  发布在  Gulp
关注(0)|答案(1)|浏览(180)

我正在尝试根据Johnpapa's Angular Style Guide设置一个angularjs项目,同时使用TypeScrip和Gulp作为构建工具。我相信目前推荐的是Gulp而不是Grunt,但我对Gulp不是很有经验。

我所拥有的:

我的项目目前看起来是这样的:

src/
   +- ts/        # contains .ts source files
   +- typings/   # contains .d.ts typing definitions
   +- html/      # contains .html files
dist/
   +- bundle.js  # single .js file containing compiled typescript and sourcemaps

按照Angular 样式指南,我为每个Angular 元素创建了一个单独的.ts文件。

my-app.module.ts
----------------

angular.module('myApp', []);

对于模块的初始化和控制器的简单实现:

my-controller.controller.ts
----------------------------

export class MyController {
    testString = 'test';
}

angular
    .module('myApp')
    .controller('MyController', MyController);

使用简单的tsconfig.json配置TypeScrip。(请注意,filesGlob尚未激活-它将从TypeScrip 2.0开始可用)

tsconfig.json
-------------

{
  "exclude" : [
    "node_modules"
  ],
  "filesGlob" : [
    "./src/typings/index.d.ts",
    "./src/ts/**/*.ts",
    "!./node_modules/**/*.ts"
  ],
  "compilerOptions": {
    "noImplicitAny": true,
    "target": "es5",
    "sourceMap" : true,
    "outFile" : "./dist/bundle.js",
    "removeComments": false
  }
}

我想要的是:

理想情况下,我想

  • 让Gulp监控./src/ts/**/*.ts中新的或更新的.ts文件
  • 连接来自./src/ts/**/*.ts的所有文件。这是Angular 正常工作所必需的。如果不手动输入对其他.ts文件的引用,我尝试过的其他方法Requirejs或Browserify将无法找到这些文件。
  • 使用tsconfig.json中的定义进行编译。这将考虑./src/typings/index.d.ts中的类型(对于外部模块,包括‘ANGLING’)。还有源Map。
  • 可能是丑化或巴宝化的步骤来完成它。

我尝试的内容:

我试着按照typescriptlang handbook的使用手册操作,但它使用的是Browserify,不适用于ANGLE。
GUP-TYPESERT也有一个关于连接文件的注解,但out选项不是这样工作的:

var gulp = require('gulp');
var ts = require('gulp-typescript');
var tsProject = ts.createProject('tsconfig.json');

gulp.task('default', function () {
    var tsResult = tsProject.src().pipe(ts(tsProject));

    return tsResult.js.pipe(gulp.dest('dist'));
});

此配置将输出一个只有注解的空文件。
this question中提到的另一种方法:

gulp.task('ts', function () {
    gulp.src('./src/ts/**/*.ts')
        .pipe(ts({
            noImplicitAny: true,
            out: 'output.js'
        }))
        .pipe(gulp.dest('./tmp/ts'));
});

gulp.task('default', ['ts'], function() {
    gulp.src(['./tmp/ts/output.js'])
        .pipe(sourcemaps.init())
        .pipe(uglify())
        .pipe(sourcemaps.write('/'))
        .pipe(gulp.dest('./dist/'));
});

但这带来了两个问题:1.尽管我只指出了./src/ts中的.ts文件,但类型脚本编译器开始从./node_modules中的.ts中喷发错误。2.它仍然没有设法将所有东西连接在一起。
我在这里完全不知所措。有人能帮我设置这个构建脚本吗?令我惊讶的是,我在任何地方都找不到类似的工作演示。

解决方案:

我已经基于this answer中的解决方案配置了GULP环境,并删除了不在类型脚本模块内的类/对象的‘EXPORT’语句

von4xj4u

von4xj4u1#

如果这有帮助,这里有一个Angular Typescript Gulp Tutorial,它有一个基本的打字、Angular 、Gulp等设置,将应用程序和供应商/节点文件连接在一起。还有demo code on github.

/* File: gulpfile.js */

// grab our gulp packages
var gulp  = require('gulp');
// Include plugins
var plugins = require("gulp-load-plugins")({
    pattern: ['gulp-*', 'gulp.*', 'main-bower-files', 'del'],
    replaceString: /\bgulp[\-.]/
});

var browserSync = require('browser-sync').create();
var reload      = browserSync.reload;

// create a default task to build the app
gulp.task('default', ['jade', 'typescript', 'bowerjs', 'bowercss', 'appcss'], function() {
  return plugins.util.log('App is built!')
});

在我的示例中,我们使用Jade to HTML:

// Jade to HTML
gulp.task('jade', function() {
    return gulp.src('src/**/*.jade')
        .pipe(plugins.jade()) // pip to jade plugin
        .pipe(gulp.dest('dist')) // tell gulp our output folder
        .pipe(reload({stream: true}))
        ;
});

对于TypeScrip,我们编译成一个app.js文件:

// TYPESCRIPT to JavaScript
gulp.task('typescript', function () {
    return gulp.src('src/**/*.ts')
        .pipe(plugins.typescript({
            noImplicitAny: true,
            out: 'app.js'
        }))
        .pipe(gulp.dest('dist/js/'))
    .pipe(reload({stream: true}))
    ;
});

对于Bower,我们将vendor.js中的所有js文件和vendor.css中的css文件合并:

// BOWER
gulp.task('bowerjs', function() {

    gulp.src(plugins.mainBowerFiles())
        .pipe(plugins.filter('**/*.js'))
    .pipe(plugins.debug())
        .pipe(plugins.concat('vendor.js'))
        .pipe(plugins.uglify())
        .pipe(gulp.dest('dist/js'));

});

gulp.task('bowercss', function() {
    gulp.src(plugins.mainBowerFiles())
        .pipe(plugins.filter('**/*.css'))
    .pipe(plugins.debug())
        .pipe(plugins.concat('vendor.css'))
        .pipe(gulp.dest('dist/css'));

});

自定义css:

// APP css
gulp.task('appcss', function () {
    return gulp.src('src/css/**/*.css')
        .pipe(gulp.dest('dist/css/'))
        .pipe(reload({
            stream: true
        }));
});

// CLEAN
gulp.task('clean', function(done) {
    var delconfig = [].concat(
        'dist',
        '.tmp/js'
    );

    // force: clean files outside current directory
    plugins.del(delconfig, {
        force: true
    }, done);
});

以下是发生更改时重新加载浏览器的内容:

// Watch scss AND html files, doing different things with each.
gulp.task('serve', ['default'], function () {

    // Serve files from the root of this project
    browserSync.init({
        server: {
            baseDir: "./dist/"
        }
    });

    gulp.watch("src/**/*.jade", ['jade']).on("change", reload);
    gulp.watch("src/**/*.ts", ['typescript']).on("change", reload);
        gulp.watch("src/**/*.css", ['appcss']).on("change", reload);
});

我的tsfig.json是这样的.我将从文本编辑器(Atom)自动编译的JS文件放入.tmp/js/tom中……有些人将.js放在与.ts相同的目录中,但我觉得这很令人困惑……文件越少对我越好:

{
  "compilerOptions": {
    "target": "ES5",
    "module": "commonjs",
    "outDir": ".tmp/js/atom"
  },
  "exclude": [
    "node_modules",
    "typings"
  ]
}

相关问题