2016-07-05 21 views
5

Tôi đang sử dụng Angular2 với SystemJS hoạt động khá tốt trong quá trình phát triển. Bây giờ tôi muốn triển khai phiên bản biên dịch đầu tiên của tôi bằng cách sử dụng gulp.Angular2, Gulp, SystemJS -> Vấn đề với phần mở rộng mặc định

Để làm rõ, tôi sử dụng các tập tin sau đây systemJS:

(function(global) { 

    // map tells the System loader where to look for things 
    var map = { 
    'app':       'app', // 'dist', 
    'rxjs':      'lib/node_modules/rxjs', 
    'angular2-in-memory-web-api': 'lib/node_modules/angular2-in-memory-web-api', 
    '@angular':     'lib/node_modules/@angular', 
    'ng2-charts/bundles':   'lib/node_modules/ng2-charts/bundles', 
    'ng2-charts/components':  'lib/node_modules/ng2-charts/components', 
    'ng2-cookies':    'lib/node_modules/ng2-cookies/' 
    }; 

    // packages tells the System loader how to load when no filename and/or no extension 
    var packages = { 
    'app':       { format: 'register', defaultExtension: 'js' }, 
    'rxjs':      { defaultExtension: 'js' }, 
    'angular2-in-memory-web-api': { defaultExtension: 'js' } 
    }; 

    var packageNames = [ 
    '@angular/common', 
    '@angular/compiler', 
    '@angular/core', 
    '@angular/http', 
    '@angular/platform-browser', 
    '@angular/platform-browser-dynamic', 
    '@angular/router', 
    '@angular/router-deprecated', 
    '@angular/testing', 
    '@angular/upgrade', 
    ]; 

    // add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' } 
    packageNames.forEach(function(pkgName) { 
    packages[pkgName] = { main: 'index.js', defaultExtension: 'js' }; 
    }); 

    var config = { 
    baseURL: "/", 
    defaultJSExtension : true, 
    map: map, 
    packages: packages 
    } 

    // filterSystemConfig - index.html's chance to modify config before we register it. 
    if (global.filterSystemConfig) { global.filterSystemConfig(config); } 

    System.config(config); 

})(this); 

Và gulpfile sau:

const gulp = require('gulp'); 
const del = require('del'); 
const typescript = require('gulp-typescript'); 
const tscConfig = require('./tsconfig.json'); 
const tsconfig = require('tsconfig-glob'); 
const sourcemaps = require('gulp-sourcemaps'); 

// clean the contents of the distribution directory 
gulp.task('clean', function() { 
    return del('dist/**/*'); 
}); 

// TypeScript compile 
gulp.task('compile', ['clean'], function() { 
    return gulp 
    .src(tscConfig.files) 
    .pipe(sourcemaps.init())   // <--- sourcemaps 
    .pipe(typescript(tscConfig.compilerOptions)) 
    .pipe(sourcemaps.write('.'))  // <--- sourcemaps 
    .pipe(gulp.dest('dist')); 
}); 

// copy dependencies 
gulp.task('copy:libs', ['clean'], function() { 
    return gulp.src([ 
     'node_modules/angular2/bundles/angular2-polyfills.js', 
     'node_modules/systemjs/dist/system.src.js', 
     'node_modules/rxjs/bundles/Rx.js', 
     'node_modules/angular2/bundles/angular2.dev.js', 
     'node_modules/angular2/bundles/router.dev.js', 
     'node_modules/chart.js/dist/Chart.bundle.min.js', 
     'node_modules/es6-shim/es6-shim.min.js', 
     'node_modules/zone.js/dist/zone.js', 
     'node_modules/reflect-metadata/Reflect.js', 
     'node_modules/systemjs/dist/system.src.js', 
     'TcAdsWebService.js' 
    ]) 
    .pipe(gulp.dest('dist/lib')) 
}); 

gulp.task('copy:modules',['clean'],function() { 
    return gulp.src([ 
    './node_modules/@angular/**/*', 
    './node_modules/rxjs/**/**', 
    './node_modules/angular2-in-memory-web-api/**/*', 
    './node_modules/ng2-charts/**/*', 
    './node_modules/ng2-cookies/**/*' 
    ],{base:'./'}).pipe(gulp.dest('dist/lib')); 
}); 

gulp.task('copy:pics',['clean'], function() { 
    return gulp.src(['pics/**/*'],{base:'./'}).pipe(gulp.dest('dist/css')); 
}) 

gulp.task('copy:css',['clean'],function() { 
    return gulp.src(['css/**/*'],{base:'./'}).pipe(gulp.dest('dist/css')); 
}); 

gulp.task('copy:js',['clean'],function() { 
    return gulp.src(['js/**/*'],{base:'./'}).pipe(gulp.dest('dist/js')); 
}); 


gulp.task('copy:systemJS',['clean'],function() { 
    return gulp.src(['systemjs.config.js']).pipe(gulp.dest('dist')); 
}); 


// copy static assets - i.e. non TypeScript compiled source 
gulp.task('copy:assets', ['clean'], function() { 
    return gulp.src(['app/**/*', 'index.html', 'styles.css', '!app/**/*.ts'], { base : './' }) 
    .pipe(gulp.dest('dist')) 
}); 

gulp.task('tsconfig-glob', function() { 
    return tsconfig({ 
    configPath: '.', 
    indent: 2 
    }); 
}); 

gulp.task('build', ['tsconfig-glob','compile', 'copy:pics', 'copy:js', 'copy:css', 'copy:systemJS','copy:modules','copy:libs', 'copy:assets']); 
gulp.task('default', ['build']); 

Sau khi xây dựng các ứng dụng angular2 và tải nó trong trình duyệt tôi nhận được lỗi sau đây trong bảng điều khiển:

Unable to load script http://localhost:81/app/app.component 

cho biết rằng nó thiếu phần mở rộng .js từ t ông đã biên soạn các tập tin. Tôi khá chắc chắn rằng,

'app':       { format: 'register', defaultExtension: 'js' }, 

thực sự yêu cầu trình biên dịch lưu ý đến phần mở rộng .js trong thư mục ứng dụng, tuy nhiên nó không. Đây là dự án angular2 đầu tiên của tôi và biên dịch gulp đầu tiên của tôi và tôi khá chắc chắn rằng tôi thiếu một số khía cạnh cơ bản của nó nhưng tôi không thể tìm thấy nó trong mã của tôi.

Trả lời

4

Với thiết lập của bạn, bạn nên sử dụng systemjs-builder để nhóm ứng dụng của bạn để sản xuất. Nó chấp nhận cấu hình SystemJS của bạn để cấu hình thêm là không cần thiết. Nó kết hợp các mô-đun của bạn vào một tệp, với các tùy chọn để rút gọn, mangle, v.v.

Điều này làm theo cách của mô-đun es6, sử dụng tốt hơn bộ nạp mô-đun của chúng tôi thay vì sao chép/dán mô-đun như chúng tôi một ứng dụng javascript truyền thống (es5).

Thực hiện việc này, chúng tôi có thể lấy tải động ra khỏi trang chỉ mục và chỉ sử dụng thẻ tập lệnh được chỉ vào gói, nó sẽ tăng tốc thời gian tải và giảm thiểu những gì người dùng phải tải xuống để tải trang của bạn. Cũng không cần phải sao chép node_modules.

Cho một cấu trúc thư mục:

src 
|-- app 
| |-- main.ts 
| |-- index.html 
| |-- bundle.min.js 
|-- system.config.js 
|-- node_modules 
|-- tsconfig.json 

Bạn thậm chí có thể làm tất cả những điều này với một nhiệm vụ ngụm.

Nhiệm vụ: (yêu cầu yargs):

var SystemBuilder = require('systemjs-builder'); 
var argv = require('yargs').argv; 
var builder = new SystemBuilder(); 

gulp.task('bundle', function() { 
    builder.loadConfig('./system.config.js') 
     .then(function() { 
      var outputFile = argv.prod ? './src/app/bundle.min.js' : './src/app/bundle.js'; 
      return builder.buildStatic('app', outputFile, { 
       minify: argv.prod, 
       mangle: argv.prod, 
       rollup: argv.prod 
      }); 
     }) 
     .then(function() { 
      console.log('bundle built successfully!'); 
     }); 
}); 

Run nhiệm vụ này:

gulp bundle 

hoặc

gulp bundle --prod 

index.html:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
    <base href="/" /> 
    <title>Your App</title> 

    <link rel="stylesheet" href='styles/bootstrap.min.css' /> 
    <script src="/bundle.js"></script> 
</head> 

<body> 
    <your-root-component> 
    </your-root-component> 
</body> 

</html> 

system.config.js:

(function (global) { 

    var config = { 
    compiler: "typescript", 
    map: { 
     'jquery': 'node_modules/jquery/dist', 
     'bootstrap': 'node_modules/bootstrap/dist/js', 
     "reflect-metadata": "node_modules/reflect-metadata", 
     "zone": "node_modules/zone.js/dist", 
     "crypto": "node_modules/crypto", 
     'rxjs': 'node_modules/rxjs', 
     'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api', 
     '@angular': 'node_modules/@angular', 
     'moment': 'node_modules/moment', 
     'angular2-moment': 'node_modules/angular2-moment', 
     'app': 'src/app', 
    }, 
    meta: { 
     'node_modules/bootstrap/dist/js/bootstrap.js': { 
     format: 'global', 
     deps: ['jquery'] 
     } 
    }, 
    packages: { 
     'jquery': { main: 'jquery.js', defaultExtension: 'js' }, 
     'bootstrap': { main: 'bootstrap.js', defaultExtension: 'js' }, 
     'zone': { main: 'zone.js', defaultExtension: 'js' }, 
     'reflect-metadata': { main: 'Reflect.js', defaultExtension: 'js' }, 
     'crypto': { main: 'sha1.js', defaultExtension: 'js' }, 
     'rxjs': { main: 'Rx.js', defaultExtension: 'js' }, 
     'moment':{main: 'moment.js', defaultExtension: 'js'}, 
     'angular2-moment': { main: 'index.js', defaultExtension: 'js' }, 
     'app': { main: 'main.js', defaultExtension: 'js' }, 

     '@angular/common': { main: 'index.js', defaultExtension: 'js' }, 
     '@angular/compiler': { main: 'index.js', defaultExtension: 'js' }, 
     '@angular/core': { main: 'index.js', defaultExtension: 'js' }, 
     '@angular/http': { main: 'index.js', defaultExtension: 'js' }, 
     '@angular/platform-browser': { main: 'index.js', defaultExtension: 'js' }, 
     '@angular/platform-browser-dynamic': { main: 'index.js', defaultExtension: 'js' }, 
     '@angular/router': { main: 'index.js', defaultExtension: 'js' }, 
     '@angular/testing': { main: 'index.js', defaultExtension: 'js' }, 
     '@angular/upgrade': { main: 'index.js', defaultExtension: 'js' }, 
     '@angular/forms': { main: 'index.js', defaultExtension: 'js' }, 
    } 
    } 

    System.config(config); 

})(this); 

Với tất cả những gì đã nói: Tôi tin rằng phần gói của bạn:

var packages = { 
    'app':       { format: 'register', defaultExtension: 'js' }, 
    'rxjs':      { defaultExtension: 'js' }, 
    'angular2-in-memory-web-api': { defaultExtension: 'js' } 
    }; 

nên là:

var packages = { 
    'app':       { main: 'main.js', defaultExtension: 'js' }, 
    'rxjs':      { main: 'Rx.js', defaultExtension: 'js' }, 
    'angular2-in-memory-web-api': { main: 'index.js', defaultExtension: 'js' } 
    }; 

main.js là bất kỳ tập tin có chứa chức năng bootstrap của bạn cho angular2 .

+0

Xin cảm ơn! Câu trả lời đó đã giúp rất nhiều. Tôi đã thiết lập và chạy với nửa giờ (Sau khi tôi cài đặt và cập nhật tất cả các gói bị thiếu :-)). –

+0

Vui vì nó đã giúp. Mô-đun ES6 là một bước tiến lớn cho rất nhiều nhà phát triển. Đó là tuyệt vời nó chỉ mất nửa giờ để có được nó xuống, tôi sẽ không nói bao lâu nó đã cho tôi để tìm tất cả những thứ này ra ... :) –

Các vấn đề liên quan