2016-07-05 4 views
5

개발 중에 SystemJS와 함께 Angular2를 사용하고 있습니다. 이제 gulp를 사용하여 컴파일 된 첫 번째 버전을 배포하려고했습니다. angular2 응용 프로그램을 구축하고 난 다음과 같은 오류를 얻을 브라우저에서로드 한 후Angular2, Gulp, SystemJS -> 기본 확장 관련 문제

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']); 

:

(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); 

그리고 다음 gulpfile :

내가 다음 systemJS 파일을 사용 명확히하기 위해 콘솔 :

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

이것은 t에서 .js 확장자가 없음을 나타냅니다. 그는 파일을 편집했다. 나는 꽤 확신한다, 그

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

실제로 컴파일러는 app 폴더에서 .js 확장자를 염두에 두어야하지만 그렇지 않다. 이것은 내 첫 번째 angular2 프로젝트이며 첫 번째 꿀꺽 꿀꺽 마는 컴파일이며, 나는 기본적인 측면이 빠져 있음을 확신하지만 코드에서 찾을 수 없다.

답변

4

설치가 완료되면 systemjs-builder을 사용하여 프로덕션을 위해 앱을 묶어야합니다. SystemJS 구성을 허용하므로 더 이상 구성 할 필요가 없습니다.

"es6 module"방식으로 모듈 복사/붙여 넣기 대신 모듈 로더를 잘 사용합니다. 전통적인 자바 스크립트 앱 (es5).

이렇게하면 색인 페이지에서 동적로드를 가져 와서 번들을 가리키는 스크립트 태그 만 사용하면로드 시간이 크게 늘어나고 사용자가 페이지를로드하기 위해 다운로드해야하는 것을 최소화해야합니다. node_modules 복사는 필요하지 않습니다.

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

당신도 하나 개 꿀꺽 작업으로이 모든 작업을 수행 할 수 있습니다

는 폴더 구조를 감안할 때.

작업은 : (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!'); 
     }); 
}); 

실행이 작업 :

gulp bundle 

또는

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); 

는 말했다 :

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

가 있어야한다 : 나는 당신의 패키지 섹션 생각

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는 angular2에 대한 귀하의 부트 스트랩 함수를 포함하는 어떤 파일 인 .

+0

와우 감사합니다! 그 대답은 많은 도움이되었습니다. 30 분 정도 지나서 실행하고 있습니다 (누락 된 패키지를 모두 설치하고 업데이트 한 후 :-)). –

+0

도움이 되니 기쁩니다. ES6 모듈은 많은 개발자를위한 큰 발걸음입니다. 그게 끝내주는 데 30 분 밖에 걸리지 않았어.이 모든 걸 알아내는 데 얼마나 걸렸는지 말하지 않을거야. :) –

관련 문제