2016-06-02 24 views
9

Tôi gặp sự cố khi tải Angular2 để tải chính xác khi kết hợp RequireJS vào ứng dụng.Angular2 với RequireJS

Để đơn giản khôn ngoan Tôi đang sử dụng rất đơn giản Hello World Javascript hướng dẫn về các Angular2 nằm ở đây: https://angular.io/docs/js/latest/quickstart.html

tôi có hệ thống này làm việc tốt bằng Angular1 nhưng tôi dường như không thể tái tạo thành công này sử dụng Angular2.

Dưới đây là file index.html của tôi:

<html> 
<head> 
    <title>Angular 2 QuickStart JS</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 

    <!-- 1. Load RequireJS --> 
    <script type="text/javascript", src="bower_components/requirejs/require.js", data-main="/require.config.js"></script> 

</head> 

<!-- 3. Display the application --> 
<body> 
    <ireland-product-app>Loading...</ireland-product-app> 
</body> 

require.config.js My file:

require([ 
    'assets/requiredPathsAndShim.js' 
], function(requirePathsAndShim) { 
require.config({ 

    baseUrl: '/', 

    paths: requirePathsAndShim.paths, 

    shim: requirePathsAndShim.shim, 

    /// Kick start app... 
    deps: ['app/main'] 
}); 

});

Tôi sử dụng tệp requiredPathsAndShim.js để tải tất cả các phụ thuộc mà tôi thấy bắt buộc phải bắt đầu ứng dụng Angular2. Dưới đây là file:

"use strict"; 

(function(define) { 
    define([], function() { 
     return { 
      waitSeconds : 10000, 
      paths: { 

       'shim'    : 'node_modules/core-js/client/shim.min', 
       'zone'    : 'node_modules/zone.js/dist/zone', 
       'Reflect'   : 'node_modules/reflect-metadata/Reflect', 
       'Rx'    : 'node_modules/rxjs/bundles/Rx.umd', 
       'core'    : 'node_modules/@angular/core/core.umd', 
       'common'   : 'node_modules/@angular/common/common.umd', 
       'compiler'   : 'node_modules/@angular/compiler/compiler.umd', 
       'platform-browser' : 'node_modules/@angular/platform-browser/platform-browser.umd', 
       'platform-dynamic' : 'node_modules/@angular/platform-browser-dynamic/platform-browser-dynamic.umd' 
      }, 
      shim : { 

      } 
     } 
    }); 
})(define); 

sau đó tôi nạp '/ main ứng dụng' tập tin từ tập tin 'required.config' của tôi mà sẽ được tải các chức năng bootstrap của Angular2:

"use strict"; 

(function() { 
    define([ 
     'app/app.component' 
    ], function(app) { 
     document.addEventListener('DOMContentLoaded', function() { 
      ng.platformBrowserDynamic.bootstrap(app.AppComponent); 
     }); 
    }); 
})(); 

Ứng dụng/app tập tin .component là một tập tin đơn giản trả về thành phần Angular2 của tôi được chuyển vào hàm bootstrap main.js để khởi động ứng dụng. đây là tệp:

"use strict"; 

(function() { 
    define([ 

    ], function() { 
     return { 
      AppComponent : ng.core.Component({ 
        selector : 'ireland-product-app', 
        template : '<h1>Product App</h1>' 
       }) 
       .Class({ 
        constructor : function() {} 
       }) 
     } 
    }); 
})(); 

Tôi đã chơi trò chơi này trong vài giờ và dường như không thể làm việc này được. Bất cứ ai có thể chỉ cho tôi đi đúng hướng là tại sao điều này không hoạt động? Tôi có một cảm giác một số shims cần phải được thêm vào require.config nhưng tôi đã không có cài đặt thành công phụ thuộc kịch bản tải như được nêu ra.

Cảm ơn

+1

Tôi biết bạn không muốn nghe điều này, nhưng bạn sẽ có một thời gian dễ dàng hơn nhiều nếu bạn sử dụng hệ thống hoặc WebPack (hoặc thậm chí Browserify) với Angular2. Hệ thống cũng hỗ trợ tải lười không đồng bộ. Ngoài ra, bạn có thể muốn xem xét sử dụng cú pháp mô-đun ES6 với TypeScript, vì nó cho phép bạn ghi nhập mô-đun của mình một lần và nhắm mục tiêu bất kỳ hệ thống mô-đun nào bạn chọn. Điều này decouples mã của bạn từ một hệ thống mô-đun cụ thể. – Martin

+0

@martin, tôi cần phải làm điều tương tự, bởi vì hệ thống hiện tại của chúng tôi sử dụng requirejs và không ngại sử dụng hệ thống, nhưng tôi nghĩ tốt nhất là tải từ mã hiện có, vì angular1 và angular2 sẽ cùng nhau lưu trữ cho đến khi angular1 hoàn toàn đã xóa. – Basit

+2

Tôi có cùng một vấn đề - tôi cố gắng chạy ứng dụng Angular2 bằng cách sử dụng RequireJS. Nhưng xin lưu ý rằng đối với RequireJS tải một số tập tin, tập tin này cần phải được trong cú pháp AMD có nghĩa là tập tin cần phải được viết bên trong một khối xác định ([], chức năng() {...}). Tuy nhiên, các script của Angular2 được viết với cú pháp khác nhau - với câu lệnh import/export. Do đó Yêu cầu không thể tải chúng, và từ khóa xuất khẩu (trong các kịch bản Angular2) ném một ký tự lỗi - bất ngờ - trên từ khóa xuất khẩu. –

Trả lời

11

Những gì bạn đang cố gắng làm là không thể (tốt, trong công nghệ phần mềm, như trong nghệ thuật - tất cả mọi thứ là có thể, nhưng để đạt được điều này, bạn sẽ cần phải chỉnh sửa kịch bản của góc, và chúng tôi không muốn điều này).

Không giống như Angular1, được phát triển trong ECMAScript5 (ngôn ngữ JavaScript yêu thích), Angular2 được phát triển trong ECMAScript6 (và trong TypeScript).

Một trong những điểm khác biệt là trong ECMAScript5 để tải tệp tập lệnh (.js, .ts, v.v.), chúng tôi cần thêm thẻ <script> với thuộc tính src, trỏ đến tệp tập lệnh. Cách khác là sử dụng thư viện của bên thứ ba, đã tải tập lệnh không đồng bộ (ví dụ: đối với các thư viện như sau: RequireJS, WebPack, SestemJS, v.v.).

Nhược điểm chính của RequireJS, là nó chỉ hoạt động trên các kịch bản được viết bằng một định dạng AMD (Asynchronous Mô-đun Definition), ví dụ:

define(['dependence_1', 'dependence_2', ...], function(alias_1, alias_2, ...) { 
// ... 
}); 

Cú pháp này rất hiệu quả khi làm việc với Angular1 và RequireJS.

Bây giờ, khi chúng ta nhìn vào thư viện Angular2, chúng ta có thể thấy rằng nó không được viết bằng cú pháp AMD, nghĩa là nó không thể được nạp bằng cách sử dụng RequireJS - mà không cần viết lại mã vào định dạng AMD. Angular2 đang mong bạn sử dụng một loại bộ tải mô-đun phổ quát. Từ khóa ở đây là phổ, có nghĩa là trình tải mô-đun có thể tải tất cả các loại định dạng tập lệnh (mô đun AMD, mô-đun CommonJS và mô-đun ES6). Ví dụ về các trình tải mô đun phổ quát là: WebPack và SystemJS.

Bây giờ chúng ta hãy nói về giải pháp cho vấn đề của bạn, tôi tin rằng bạn sẽ cần phải di chuyển từ RequireJS đến Webpack - vì quá trình di chuyển không quá phức tạp.

BướC# 1 - 3rd Party Libraries

Khi tải Libraries 3rd Party với RequireJS, chúng tôi đang sử dụng RequireJS của pathshims, có thể dễ dàng chuyển đổi thành Webpack của alias. Nhưng điều này là không cần thiết: một khi bạn đang làm việc với Webpack, bạn có một hỗ trợ npm. Điều này có nghĩa là bạn có thể chạy npm install library-name và bây giờ bạn có thể sử dụng thư viện này mà không cần RequireJS.

BướC# 2 - Ứng dụng script

May mắn cho chúng tôi, chúng tôi hầu như không cần phải làm gì đây. Vì Webpack là một trình nạp mô-đun phổ dụng, nó có thể tải các kịch bản ở định dạng AMD. Vì vậy, tất cả các kịch bản ứng dụng đã được phát triển theo định dạng RequireJS, có thể được tải bằng cách sử dụng Webpack mà không có bất kỳ thay đổi nào.

Để biết thêm về làm thế nào để di chuyển từ RequireJS để Webpack xem bài viết này: https://gist.github.com/xjamundx/b1c800e9282e16a6a18e

+0

@devoncrazylegs nếu câu trả lời này giải quyết được vấn đề của bạn, vui lòng đánh dấu là "Đã giải quyết" –