मैं वास्तव में एक कोणीय 2 + टाइपस्क्रिप्ट + systemjs ऐप कैसे तैनात कर सकता हूं?


103

वहाँ angular.io पर एक त्वरित ट्यूटोरियल है जो टाइपस्क्रिप्ट और सिस्टमज का उपयोग करता है। अब जब मुझे वह मीनियाप चल रहा है, तो मैं कुछ तैनात करने योग्य कैसे बनाऊंगा? मुझे इसके बारे में कोई जानकारी नहीं मिली।

क्या मुझे System.config में किसी अतिरिक्त टूल, किसी अतिरिक्त सेटिंग्स की आवश्यकता है?

(मुझे पता है कि मैं वेबपैक का उपयोग कर सकता हूं और एक बंडल बना सकता हूं। जेएस, लेकिन मैं सिस्टमज का उपयोग करना चाहूंगा क्योंकि यह ट्यूटोरियल में उपयोग किया जाता है)

क्या कोई इस सेटअप के साथ अपनी निर्माण प्रक्रिया साझा कर सकता है (कोणीय 2, टाइपस्क्रिप्ट, सिस्टमज)


यहाँ JSPM का उपयोग कर तैनाती के लिए ng2 ऐप बनाने के लिए मेरा नुस्खा है: stackoverflow.com/a/34616199/3532945
brando

2
इसका सरल उत्तर एनजी निर्माण -prod stackoverflow.com/a/38421680/5079380
अम्र eladawy

जवाबों:


66

इस स्तर पर समझने वाली महत्वपूर्ण बात यह है कि निम्नलिखित कॉन्फ़िगरेशन का उपयोग करके, आप सीधे संकलित जेएस फाइलों को समाप्‍त नहीं कर सकते हैं।

टाइपस्क्रिप्ट कंपाइलर कॉन्फ़िगरेशन में:

{
  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "declaration": false,
    "stripInternal": true,
    "module": "system",
    "moduleResolution": "node",
    "noEmitOnError": false,
    "rootDir": ".",
    "inlineSourceMap": true,
    "inlineSources": true,
    "target": "es5"
  },
  "exclude": [
    "node_modules"
  ]
}

HTML में

System.config({
  packages: {
    app: {
      defaultExtension: 'js',
      format: 'register'
    }
  }
});

तथ्य की बात के रूप में, इन जेएस फाइलों में गुमनाम मॉड्यूल होंगे। एक अनाम मॉड्यूल एक JS फ़ाइल है जो System.registerपहले पैरामीटर के रूप में मॉड्यूल नाम के बिना उपयोग करता है । यह तब होता है जब टाइपस्टेप कंपाइलर डिफ़ॉल्ट रूप से उत्पन्न होता है जब सिस्टमज को मॉड्यूल मैनेजर के रूप में कॉन्फ़िगर किया जाता है।

तो अपने सभी मॉड्यूल को एक सिंगल जेएस फ़ाइल में रखने के लिए, आपको outFileअपने टाइपस्क्रिप्ट कंपाइलर कॉन्फ़िगरेशन के भीतर संपत्ति का लाभ उठाने की आवश्यकता है ।

आप ऐसा करने के लिए निम्न अंदर gulp का उपयोग कर सकते हैं:

const gulp = require('gulp');
const ts = require('gulp-typescript');

var tsProject = ts.createProject('tsconfig.json', {
  typescript: require('typescript'),
  outFile: 'app.js'
});

gulp.task('tscompile', function () {
  var tsResult = gulp.src('./app/**/*.ts')
                     .pipe(ts(tsProject));

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

इसे कुछ अन्य प्रसंस्करण के साथ जोड़ा जा सकता है:

  • चीजों को संकलित करने के लिए संकलित टाइपस्क्रिप्ट फाइलें
  • एक app.jsफ़ाइल बनाने के लिए
  • vendor.jsतीसरे पक्ष के पुस्तकालयों के लिए एक फ़ाइल बनाने के लिए
  • boot.jsएप्लिकेशन को बूट करने वाले मॉड्यूल को आयात करने के लिए एक फ़ाइल बनाने के लिए। इस फ़ाइल को पृष्ठ के अंत में शामिल किया जाना चाहिए (जब सभी पृष्ठ लोड किया जाता है)।
  • अद्यतन करने के लिए index.htmlखाते में इन दो फ़ाइलों लेने के लिए

निम्न निर्भरताएँ गल्प कार्यों में उपयोग की जाती हैं:

  • घूंट-concat
  • घूंट एचटीएम्एल की जगह
  • घूंट-टाइपप्रति
  • घूंट-रूप बिगाड़ना

निम्नलिखित एक नमूना है इसलिए इसे अनुकूलित किया जा सकता है।

  • app.min.jsफ़ाइल बनाएँ

    gulp.task('app-bundle', function () {
      var tsProject = ts.createProject('tsconfig.json', {
        typescript: require('typescript'),
        outFile: 'app.js'
      });
    
      var tsResult = gulp.src('app/**/*.ts')
                       .pipe(ts(tsProject));
    
      return tsResult.js.pipe(concat('app.min.js'))
                    .pipe(uglify())
                    .pipe(gulp.dest('./dist'));
    });
  • vendors.min.jsफ़ाइल बनाएँ

    gulp.task('vendor-bundle', function() {
      gulp.src([
        'node_modules/es6-shim/es6-shim.min.js',
        'node_modules/systemjs/dist/system-polyfills.js',
        '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/http.dev.js'
      ])
      .pipe(concat('vendors.min.js'))
      .pipe(uglify())
      .pipe(gulp.dest('./dist'));
    });
  • boot.min.jsफ़ाइल बनाएँ

    gulp.task('boot-bundle', function() {
      gulp.src('config.prod.js')
        .pipe(concat('boot.min.js'))
        .pipe(uglify())
        .pipe(gulp.dest('./dist'));
     });

    config.prod.jsबस निम्नलिखित शामिल हैं:

     System.import('boot')
        .then(null, console.error.bind(console));
  • index.htmlफ़ाइल को अपडेट करें

    gulp.task('html', function() {
      gulp.src('index.html')
        .pipe(htmlreplace({
          'vendor': 'vendors.min.js',
          'app': 'app.min.js',
          'boot': 'boot.min.js'
        }))
        .pipe(gulp.dest('dist'));
    });

    index.htmlदिखता है निम्नलिखित की तरह:

    <html>
      <head>
        <!-- Some CSS -->
    
        <!-- build:vendor -->
        <script src="node_modules/es6-shim/es6-shim.min.js"></script>
        <script src="node_modules/systemjs/dist/system-polyfills.js"></script>
        <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
        <script src="node_modules/systemjs/dist/system.src.js"></script>
        <script src="node_modules/rxjs/bundles/Rx.js"></script>
        <script src="node_modules/angular2/bundles/angular2.dev.js"></script>
        <script src="node_modules/angular2/bundles/http.dev.js"></script>
        <!-- endbuild -->
    
        <!-- build:app -->
        <script src="config.js"></script>
        <!-- endbuild -->
      </head>
    
      <body>
        <my-app>Loading...</my-app>
    
        <!-- build:boot -->
        <!-- endbuild -->
      </body>
    </html>

ध्यान दें कि फ़ाइल System.import('boot');से पंजीकृत होने के लिए आपके सभी एप्लिकेशन घटकों की प्रतीक्षा करने के लिए शरीर के अंत में किया जाना चाहिए app.min.js

मैं यहाँ CSS और HTML मिनिफिकेशन को संभालने का तरीका नहीं बताता हूँ।


1
आप कृपया एक उदाहरण के साथ एक github रेपो बना सकते हैं?
jdelobel

मैंने आपके निर्देशों का पालन किया और सब कुछ ठीक लग रहा था। हालाँकि, जब मैं ब्राउज़र में ऐप चलाता हूं तो मुझे यह कंसोल लॉग एरर मिलता है: "system.src.js: 1625 Uncaught TypeError: मल्टीपल अनाम System.register कॉल एक ही मॉड्यूल फाइल में।" किसी भी विचार का क्या अर्थ है और इसे कैसे ठीक किया जाए?
एंगुलरएम

@AngularM: क्या आपके पास आउटफाइल पैरामीटर है? यह आपकी त्रुटि के लिए महत्वपूर्ण है ;-)
थियरी टेम्पलियर

मैं इसे अपने gulp फ़ाइल और tsconfig में रखता हूँ
AngularM

क्या आप मेरे द्वारा प्रस्तुत किए गए जीथब प्रोजेक्ट पर एक नज़र डाल सकते हैं? ऊपर मेरी टिप्पणी देखें। क्या आप अपने कोड के साथ कुछ अंतर देखते हैं?
थियरी टेम्पलियर

28

आप angular2-cli build कमांड का उपयोग कर सकते हैं

ng build -prod

https://github.com/angular/angular-cli/wiki/build#bundling

सभी निर्भरता को एक ही फ़ाइल में या बंडल करके -प्रोड फ्लैग के साथ बनाया गया , और ट्री- शेकिंग तकनीकों का उपयोग करें ।ng build -prodng serve -prod

अपडेट करें

यह उत्तर प्रस्तुत किया गया था जब कोणीय 2 rc4 में था

मैंने इसे फिर से कोणीय-क्ली बीटा 21 और कोणीय 2 ^ 2.1.0 पर आजमाया था और यह उम्मीद के मुताबिक काम कर रहा है

इस उत्तर के लिए कोणीय-क्ली के साथ ऐप को इनिशियलाइज़ करने की आवश्यकता है जिसका आप उपयोग कर सकते हैं

ng new myApp

या किसी मौजूदा पर

ng init

अपडेट 08/06/2018

कोणीय 6 के लिए वाक्य रचना अलग है।

ng build --prod --build-optimizer

प्रलेखन की जाँच करें


8
इसके लिए आवश्यक है कि आपका ऐप कोणीय-क्ली के अभिमत संरचना में संरचित हो।
माइकल पेल

2
@Arr ElAdawy FYI करना कोणीय-क्लि वेबपैक में चला गया। यह सवाल SystemJS से संबंधित है। एनजी बिल्ड मेरे लिए काम नहीं किया है।
शाहियार हसन सईद

@ShahriarHasanSayeed क्या आप उस समय का उल्लेख कर रहे हैं जब मैंने उत्तर प्रस्तुत किया था या जिस समय आपने कोशिश की थी?
अमर एलावेई

@ArrElAdawy, क्या आप उन मॉड्यूल के लिए संस्करण जोड़ सकते हैं जहां यह वास्तव में काम करता है। जुलाई से एंगुलर 2 काफी बदल गया है।
21

2
टूर ऑफ़ हीरोज़ ट्यूटोरियल को क्ली वर्जन में बदलना मामूली है। बस cli का उपयोग करके एक नया प्रोजेक्ट तैयार करें और फिर ट्यूटोरियल फाइलों को कॉपी करें।
रोजडी कासिम

12

आप टाइपप्रति में एक कोणीय 2 (2.0.0-rc.1) परियोजना के साथ SystemJS का उपयोग कर निर्माण कर सकते हैं Gulp और SystemJS-बिल्डर

नीचे 2.0.0-rc.1 ( पूर्ण स्रोत , लाइव उदाहरण ) चल रहे हीरोज के निर्माण, बंडल, और मिनिफ़ाई टूर का सरल संस्करण है ।

gulpfile.js

var gulp = require('gulp');
var sourcemaps = require('gulp-sourcemaps');
var concat = require('gulp-concat');
var typescript = require('gulp-typescript');
var systemjsBuilder = require('systemjs-builder');

// Compile TypeScript app to JS
gulp.task('compile:ts', function () {
  return gulp
    .src([
        "src/**/*.ts",
        "typings/*.d.ts"
    ])
    .pipe(sourcemaps.init())
    .pipe(typescript({
        "module": "system",
        "moduleResolution": "node",
        "outDir": "app",
        "target": "ES5"
    }))
    .pipe(sourcemaps.write('.'))
    .pipe(gulp.dest('app'));
});

// Generate systemjs-based bundle (app/app.js)
gulp.task('bundle:app', function() {
  var builder = new systemjsBuilder('public', './system.config.js');
  return builder.buildStatic('app', 'app/app.js');
});

// Copy and bundle dependencies into one file (vendor/vendors.js)
// system.config.js can also bundled for convenience
gulp.task('bundle:vendor', function () {
    return gulp.src([
        'node_modules/jquery/dist/jquery.min.js',
        'node_modules/bootstrap/dist/js/bootstrap.min.js',
        'node_modules/es6-shim/es6-shim.min.js',
        'node_modules/es6-promise/dist/es6-promise.min.js',
        'node_modules/zone.js/dist/zone.js',
        'node_modules/reflect-metadata/Reflect.js',
        'node_modules/systemjs/dist/system-polyfills.js',
        'node_modules/systemjs/dist/system.src.js',
      ])
        .pipe(concat('vendors.js'))
        .pipe(gulp.dest('vendor'));
});

// Copy dependencies loaded through SystemJS into dir from node_modules
gulp.task('copy:vendor', function () {
  gulp.src(['node_modules/rxjs/**/*'])
    .pipe(gulp.dest('public/lib/js/rxjs'));

  gulp.src(['node_modules/angular2-in-memory-web-api/**/*'])
    .pipe(gulp.dest('public/lib/js/angular2-in-memory-web-api'));
  
  return gulp.src(['node_modules/@angular/**/*'])
    .pipe(gulp.dest('public/lib/js/@angular'));
});

gulp.task('vendor', ['bundle:vendor', 'copy:vendor']);
gulp.task('app', ['compile:ts', 'bundle:app']);

// Bundle dependencies and app into one file (app.bundle.js)
gulp.task('bundle', ['vendor', 'app'], function () {
    return gulp.src([
        'app/app.js',
        'vendor/vendors.js'
        ])
    .pipe(concat('app.bundle.js'))
    .pipe(uglify())
    .pipe(gulp.dest('./app'));
});

gulp.task('default', ['bundle']);

system.config.js

var map = {
  'app':                                'app',
  'rxjs':                               'vendor/rxjs',
  'zonejs':                             'vendor/zone.js',
  'reflect-metadata':                   'vendor/reflect-metadata',
  '@angular':                           'vendor/@angular'
};

var packages = {
  'app':                                { main: 'main', defaultExtension: 'js' },
  'rxjs':                               { defaultExtension: 'js' },
  'zonejs':                             { main: 'zone', defaultExtension: 'js' },
  'reflect-metadata':                   { main: 'Reflect', 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',
];

packageNames.forEach(function(pkgName) {
  packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
});

System.config({
  map: map,
  packages: packages
});


2
क्या आप कृपया बता सकते हैं कि SystemJs और Gulp कैसे चलाएं?
Jan Drozen

@JanDrozen अपने gulpfile के समान स्थान पर, आप चला सकते हैं gulp <taskname>जहाँ "taskname" उस कार्य का नाम है जो SystemJS बिल्डर को कॉल करता है, मेरे उपरोक्त उदाहरण में यह है bundle:app। उस गुलप कार्य में आप अपने सिस्टम कॉन्फिगरेशन और आउटफिट को निर्दिष्ट करने के लिए 'systemjs-builder' npm मॉड्यूल का उपयोग कर सकते हैं।
स्टीली

@ फौलादी: धन्यवाद! एक जादू की तरह काम करता है। डिफ़ॉल्ट लक्ष्य की अपेक्षा - बदसूरत () विधि गायब है (या मुझे कुछ याद आ रहा है)। क्या आप मुझे यह अंतिम अस्पष्ट हिस्सा समझा सकते हैं?
Jan Drozen

@ क्या आप कृपया मार्गदर्शन करेंगे कि इसे कोणीय 2 के नए संस्करण के साथ कैसे किया जाए?
माइक्रोनिक्स

@ Steely.can आप नवीनतम कोणीय 2 बिल्ड फ़ाइलों का एक अंतिम लिंक (github पर) प्रदान करते हैं, जिन्हें angular2 क्विकार्ट-ऐप चलाने की आवश्यकता होती है?
माइक्रोनिक्स

1

यहाँ मेरी MEA2N बॉयलर 2 को Angular 2 के लिए देखा गया है: https://github.com/simonxca/mean2-boilerplate

यह एक साधारण बॉयलरप्लेट है जो tscचीजों को एक साथ रखने के लिए उपयोग करता है। (वास्तव में ग्रंट -टीएस का उपयोग करता है , जो इसके मूल में सिर्फ tscकमांड है।) कोई वेकपैक, आदि आवश्यक नहीं है।

आप ग्रंट का उपयोग करते हैं या नहीं, विचार यह है:

  • नामक फ़ोल्डर में अपने ऐप्लिकेशन के बारे में ts/(उदाहरण: public/ts/)
  • का उपयोग tscअपने की निर्देशिका संरचना दर्पण ts/एक में फ़ोल्डर js/में फ़ोल्डर और सिर्फ संदर्भ फ़ाइलों js/अपने में फ़ोल्डर index.html

काम करने के लिए ग्रन्ट-टीएस प्राप्त करने के लिए (सादे tsc, गल्प आदि के लिए समतुल्य कमांड होनी चाहिए), आपके पास अपने tsconfig.jsonनाम से एक प्रॉपर्टी है "outDir": "../js", और इसे अपने gruntfile.jsसाथ रेफर करें :

grunt.initConfig({
  ts: {
    source: {tsconfig: 'app/ts/tsconfig.json'}
  },
  ...
});

फिर चलाएं grunt ts, जो आपके ऐप को अंदर ले जाएगा public/ts/और इसे मिरर करेगा public/js/

वहाँ। सुपर आसान समझने के लिए। सबसे अच्छा तरीका नहीं है, लेकिन एक अच्छी शुरुआत करने के लिए।


1

सबसे आसान तरीका है कि मैं systemJs के लिए कोणीय RC1 बंडल करने पाया है उपयोग करने के लिए है gulpऔर systemjs-builder:

gulp.task('bundle', function () {
    var path = require('path');
    var Builder = require('systemjs-builder');

    var builder = new Builder('/node_modules');

    return builder.bundle([
        '@angular/**/*.js'
        ], 
        'wwwroot/bundle.js', 
        { minify: false, sourceMaps: false })
        .then(function () {
            console.log('Build complete');
        })
        .catch(function (err) {
            console.log('Build error');
            console.log(err);
        });
});

जैसा कि टिप्पणियों में बताया गया है, सिस्टमजेस में वर्तमान में ऐसे मुद्दे हैं जब घटकों का उपयोग करते हुए बंडल किया जाता है moduleId: module.id

https://github.com/angular/angular/issues/6131

वर्तमान सिफारिश (कोणीय 2 आरसी 1) स्पष्ट रास्तों का उपयोग करती हुई प्रतीत होती है moduleId: '/app/path/'


यह आशाजनक लगता है लेकिन यह तब विफल होता है जब मैं @Componentडेकोरेटर में बाहरी टेम्प्लेट के सापेक्ष पथ का उपयोग करता हूं । bundle.jsभले ही वे सापेक्ष हों, पथ को पूर्ण रूप से हल करने का प्रयास करते हैं, जिससे 404 त्रुटियां होती हैं (देखें stackoverflow.com/questions/37497635-… )। आपने इससे कैसे निपटा है?
बीटलजुआइस

क्या आप moduleIdसापेक्ष पथ पर सेट हो रहे हैं ?
पौल

पक्का नहीं मै समझ गया। मेरे पास moduleId: module.idहै@Component
बीटलज्यूइस

इसमें वही कमियां हैं जो नीचे के पूरे रास्ते को नीचे करती हैं templateUrlऔर moduleIdपहले स्थान पर होने के उद्देश्य को हरा देती हैं । (मैं के रूप में सिफारिश संबंधित पथ का उपयोग करने के कोशिश कर रहा हूँ angular.io/docs/ts/latest/cookbook/... )
बीटलजूस

आप स्पष्ट रूप से खुद को पथ निर्धारित करके अधिक भाग्य प्राप्त कर सकते हैं जैसेmoduleId: '/app/components/home/'
पॉल


0

Angular.io वेबसाइट के तहत, उन्नत / तैनाती अनुभाग के तहत, यह अनुशंसा की जाती है कि तैनात करने का सबसे सरल तरीका 'सर्वर के विकास के वातावरण की नकल करना' है।

  1. के तहत अनुभाग के माध्यम से जाना: सरल तैनाती संभव है। अंतिम प्रोजेक्ट फाइलें कोड सेक्शन के अंदर दिखाई जाती हैं। ध्यान दें कि यह पहले से ही वेब से npm पैकेज फ़ाइलों को लोड करने के लिए कोड सेट करता है (स्थानीय npm_modules फ़ोल्डर से)।

  2. सुनिश्चित करें कि यह आपके स्थानीय कंप्यूटर (npm start) पर चल रहा है। फिर प्रोजेक्ट फ़ोल्डर के तहत, आपके द्वारा सेट किए गए S3 बाल्टी के सब-फोल्डर के तहत सब कुछ कॉपी करें। आप कॉपी करने के लिए ड्रैग-एंड-ड्रॉप का उपयोग कर सकते हैं, उस प्रक्रिया के दौरान, आपको फ़ाइलों के लिए अनुमति सेटिंग का चयन करने का विकल्प मिलता है, उन्हें 'सबके लिए' पठनीय बनाना सुनिश्चित करें।

  3. बकेट 'प्रॉपर्टीज़' टैब के तहत, 'स्टेटिक वेबसाइट होस्टिंग' पैनल देखें, 'वेबसाइट को होस्ट करने के लिए इस बकेट का उपयोग करें' विकल्प पर जाँच करें और इंडेक्स डॉक्यूमेंट और एरर डॉक्यूमेंट दोनों के लिए 'index.html' निर्दिष्ट करें।

  4. स्थिर वेबसाइट एंडपॉइंट पर क्लिक करें, आपकी परियोजना अच्छी तरह से चल रही है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.