ค้นหาเว็บไซต์

node.js - วิธีโหลดไฟล์ที่รวมกันในการนำเข้าแบบ system ใน Angular 2 โดยใช้ Gulp: ข้อผิดพลาด: มีการเรียกใช้ System.register แบบไม่ระบุชื่อหลายครั้งในโมดูล


ฉันมีแอปพลิเคชัน Angular 2 ที่ใช้ TypeScript ซึ่งสร้างไฟล์ JS

เมื่อเร็วๆ นี้ฉันได้ติดตั้ง npm และ gulp และเขียนงานเพื่อรวมไฟล์ js ทั้งหมดเป็นไฟล์เดียว ตอนนี้จะโหลดไฟล์นั้นอย่างไร?

ก่อนหน้านี้ในหน้า index.html ของฉัน: //ซึ่งทำงานได้โดยที่ main เป็นคอมโพเนนต์ที่บูตสแตรป appComponent

<script>
        System.config({
            packages: {
                app: {
                    format: 'register',
                    defaultExtension: 'js',
                    defaultJSExtensions: true
                }
            }
        });
        debugger;
        //System.import('Scripts/main')
        System.import('app/V1/components/main')
              .then(null, console.error.bind(console));
    </script>

งาน Gulp ของฉัน:

var config = {
    src: ['app/**/*.js'],
    dest: ['Scripts/']
};

gulp.task('bundle', function () {

    console.log('testing');
    return gulp.src(config.src)
      .pipe(uglify())
      .pipe(concat('all.min.js'))
      .pipe(gulp.dest('app/'));
})

เมื่อฉันรันงาน gulp นี้ มันจะสร้าง all.min.js แต่ตอนนี้จะใช้ยังไง เช่น จะลบ main.js ใน System.import และโหลดไฟล์นี้อย่างไร

<script>
        System.config({
            packages: {
                app: {
                    format: 'register',
                    defaultExtension: 'js',
                    defaultJSExtensions: true
                }
            },
            map: {
                immutable: 'app/all.min.js'
            }
        });
        debugger;
        //System.import('Scripts/main')
        System.import('app/all.min')
              .then(null, console.error.bind(console));
    </script>

ฉันลองวิธีนี้ซึ่งทำให้เกิดข้อผิดพลาดดังนี้

ข้อผิดพลาด: มีการเรียกใช้ System.register แบบไม่ระบุชื่อหลายครั้งในโมดูล http://localhost:55308/app/all.min.js หากกำลังโหลดไฟล์ bundle ให้แน่ใจว่าการเรียกใช้ System.register ทั้งหมดมีชื่อ

คำตอบ #1

ฉันคิดว่ามีวิธีแก้ปัญหาที่ดีกว่าสำหรับการรวมไฟล์เพื่อใช้กับ system.js มีไลบรารีที่สะดวกเรียกว่า systemjs-builder คุณสามารถใช้งานมันได้อย่างง่ายดายกับ gulp

ก่อนอื่นคุณต้องแยกสคริปต์ system.js ของคุณไปยังไฟล์แยก จากนั้นคุณสามารถใช้งานนี้เพื่อสร้างไฟล์ js ที่รวมกันได้

gulp.task('system', () => {
    var builder = new systemBuilder();

    return builder.loadConfig('./system.config.js') // Name of your system js file
        .then(() => builder.buildStatic('app',  'total.js'))

});

ตอนนี้คุณมีไฟล์ที่รวมกันแล้ว รวมทั้งการตั้งค่า system.js ที่จำเป็นในการรัน ทุกอย่างควรทำงานได้ดีในตอนนี้ อย่างไรก็ตามคุณจะต้องใช้ไลบรารีแยกต่างหากเพื่อทำให้ js ยากต่อการอ่าน gulp-uglify ควรทำงานได้ดี

นี่คือตัวอย่างงาน:

gulp.task('build', ['system'], () => {
    return gulp.src([
        'node_modules/core-js/client/shim.min.js',
        'node_modules/zone.js/dist/zone.js',
        'node_modules/reflect-metadata/Reflect.js',
        'node_modules/systemjs/dist/system.src.js',
        'total.js'
    ])
        .pipe(concat('main.js'))
        .pipe(uglify())
        .pipe(gulp.dest('./'))
    });

ตอนนี้ถ้าคุณรัน gulp build และรวมไฟล์ main.js ที่สร้างขึ้นไปใน index.html ของคุณ (โดยลบสคริปต์อื่นๆ ทั้งหมดออก) ทุกอย่างควรทำงานได้

บทความที่เกี่ยวข้อง