2017-03-12 16 views
6

Tôi đang xây dựng một POC của ứng dụng Angular 1 + 2 Hybrid. Tôi đã quản lý để chạy nó và bây giờ tôi đang cố gắng để giới thiệu Webpack.AngularJS không được tìm thấy trong ứng dụng Hybrid

Tôi gặp lỗi Error: AngularJS v1.x is not loaded! khi khởi động mô-đun. Tôi đã kiểm tra - góc được nạp khi khởi tạo mô-đun.

Mọi trợ giúp sẽ được đánh giá cao.

tập tin nhập:

import { downgradeInjectable, downgradeComponent } from '@angular/upgrade/static'; 
import { BrowserModule } from '@angular/platform-browser'; 
import {NgModule} from '@angular/core'; 
import {HelloAngular2} from './components/hello-angular2'; 
import {TimeZonesService} from './services/timezones'; 
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 
import { UpgradeModule } from '@angular/upgrade/static'; 
import * as angular from 'angular'; 

angular.module('scotchTodo', [/*'todoController', 'todoService'*/]); 
angular.module('scotchTodo').directive('helloAngular2', downgradeComponent({ component: HelloAngular2})); 
angular.module('scotchTodo').factory('timeZones', downgradeInjectable(TimeZonesService)); 

@NgModule({ 
declarations: [HelloAngular2], 
entryComponents: [HelloAngular2], 
imports: [BrowserModule, UpgradeModule], 
providers: [TimeZonesService] 
}) 
class MyNg2Module { 
    ngDoBootstrap() {}; 
} 

platformBrowserDynamic().bootstrapModule(MyNg2Module).then(platformRef => { 
    const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule; 
    upgrade.bootstrap(document.documentElement, ['scotchTodo']); 
}); 

Webpack config:

var webpack = require('webpack'), 
    path = require('path'), 
    ExtractTextPlugin = require('extract-text-webpack-plugin'); 

var config = { 
    entry: { 
    app: __dirname + '/public/js/boot.js' 
    }, 
    output: { 
    path: __dirname + '/public/dist', 
    filename: 'app-loader.js' 
    }, 
    resolve:{ 
     extensions: ['.js'], 
     alias: { 
      'controllers/main.js': 'controllers/main.js', 
      'services/todos.js':'services/todos.js' 
     } 
    } 
}; 

module.exports = config; 

tsconfig.json:

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "commonjs", 
    "moduleResolution": "node", 
    "sourceMap": true, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "removeComments": false, 
    "noImplicitAny": false 
    }, 
    "exclude": [ 
    "node_modules", 
    "public/jslibs", 
    "typings/main", 
    "typings/main.d.ts" 
    ] 
} 

Bootstrap tạo bộ phận đã được định nghĩa góc:

angular.module('scotchTodo', []); 
angular.module('scotchTodo').directive('helloAngular2', static_1.downgradeComponent({ component: hello_angular2_1.HelloAngular2 })); 
angular.module('scotchTodo').factory('timeZones', static_1.downgradeInjectable(timezones_1.TimeZonesService)); 
var MyNg2Module = (function() { 
    function MyNg2Module() { 
    } 
    MyNg2Module.prototype.ngDoBootstrap = function() { }; 
    ; 
    return MyNg2Module; 
}()); 
MyNg2Module = __decorate([ 
    core_1.NgModule({ 
     declarations: [hello_angular2_1.HelloAngular2], 
     entryComponents: [hello_angular2_1.HelloAngular2], 
     imports: [platform_browser_1.BrowserModule, static_2.UpgradeModule], 
     providers: [timezones_1.TimeZonesService] 
    }) 
], MyNg2Module); 
platform_browser_dynamic_1.platformBrowserDynamic().bootstrapModule(MyNg2Module).then(function (platformRef) { 
    var upgrade = platformRef.injector.get(static_2.UpgradeModule); 
    upgrade.bootstrap(document.documentElement, ['scotchTodo']); 
}); 

--UPDATE--

Sau khi thêm ProvidePlugin với cấu hình này:

webpack.ProvidePlugin mới ({ 'góc': 'góc' ' })

lỗi Error: AngularJS v1.x is not loaded! mà tôi cho là đến từ Mô-đun nâng cấp đã biến mất. Bây giờ góc là undefined trong angular.module vì góc được nhập khẩu bởi __webpack_require__

--UPDATE 2--

Nó có vẻ như vấn đề là AngularJS không hỗ trợ CommonJS module.exports phong cách. Tôi đang cố gắng sử dụng exports-loader nhưng hiện không hoạt động. Các cấu hình là:

loaders: [ 
     { test: /[\/]angular\.js$/, loader: "exports-loader?angular" } 
    ] 

--UPDATE 3--

Sau khi thêm module.exports = windows.angular; để bootstrap tạo tập tin không có lỗi. Nhưng ứng dụng vẫn không hoạt động vì không có chức năng resumeBootstrap cho góc có sẵn.

--UPDATE 4--

Đây là mã HTML của trang chính:

<body ng-controller="mainController"> 
<div class="container"> 

    <!-- HEADER AND TODO COUNT --> 
    <div class="jumbotron text-center"> 
     <h1>I'm a Todo-aholic <span class="label label-info">{{ todos.length }}</span></h1> 
    </div> 

    <!-- TODO LIST --> 
    <div id="todo-list" class="row"> 
     <div class="col-sm-4 col-sm-offset-4"> 



      <!-- LOOP OVER THE TODOS IN $scope.todos --> 
      <div class="checkbox" ng-repeat="todo in todos"> 
       <label> 
        <input type="checkbox" ng-click="deleteTodo(todo._id)"> {{ todo.text }} 
       </label> 
      </div> 

      <p class="text-center" ng-show="loading"> 
       <span class="fa fa-spinner fa-spin fa-3x"></span> 
      </p> 

     </div> 
    </div> 

    <!-- FORM TO CREATE TODOS --> 
    <div id="todo-form" class="row"> 
     <div class="col-sm-8 col-sm-offset-2 text-center"> 
      <form> 
       <div class="form-group"> 

        <!-- BIND THIS VALUE TO formData.text IN ANGULAR --> 
        <input type="text" class="form-control input-lg text-center" placeholder="I want to buy a puppy that will love me forever" ng-model="formData.text"> 
       </div> 

       <!-- createToDo() WILL CREATE NEW TODOS --> 
       <button type="submit" class="btn btn-primary btn-lg" ng-click="createTodo()">Add</button> 
      </form> 
     </div> 
    </div> 

    <div class="text-center text-muted"> 
     <p>A demo by <a href="http://scotch.io">Scotch</a>.</p> 
     <p>Read the <a href="http://scotch.io/tutorials/javascript/creating-a-single-page-todo-app-with-node-and-angular">tutorial</a>.</p> 
    </div> 

</div> 

--UPDATE--

thiết lập window.name = "NG_DEFER_BOOTSTRAP!"; giúp kiễu góc init resumeBootstrap chức năng nhưng ứng dụng vẫn không hoạt động

+0

Mọi độ phân giải? Tôi hiện đang chạy vào cùng một vấn đề và xuất hiện mã rất giống với của tôi :-) –

+0

có thể thử và nhập với các hiệu ứng phụ cho webpack trong một điểm nhập chỉ nhập mẫu và sau đó bao gồm trong index.html – harishr

+0

@harishr của bạn Tôi không hiểu ý bạn là gì, tác dụng phụ là gì? – Michael

Trả lời

1

Tôi hiểu rằng bạn có vấn đề khi trộn Angular 1 & 2. Bạn có thể đã bỏ lỡ một vài điều trong khi thiết lập.

tôi stumbled khi bài đăng blog mà là hữu ích:

https://medium.com/@SevenLee/configuration-tips-to-build-hybrid-angular-1-and-angular-2-project-in-real-world-230b715629dc#.r57e4561a

Ngoài ra, như thế nào html của bạn trông như thế nào?

CẬP NHẬT

góc 1 => Webpack

góc 2 => Webpack 2

Về Webpack kho git khuyên bạn sử dụng một bộ khác nhau làm cho góc 1, có nghĩa là bạn không thể sử dụng Góc 1 với Webpack đó.

Họ khuyên bạn tu sử dụng NG6 thay vì:

"Nếu bạn đang tìm kiếm 1.x góc xin vui lòng sử dụng NG6-starter Nếu bạn đang tìm kiếm để tìm hiểu về Webpack và ES6 Xây dựng Công cụ kiểm tra ES6-dựng- công cụ Nếu bạn đang tìm kiếm để học nguyên cảo thấy TypeStrong/learn-nguyên cảo Nếu bạn đang tìm kiếm cái gì dễ dàng hơn để bắt đầu với sau đó xem các angular2 hạt mà tôi cũng duy trì góc/angular2 hạt"

Cheers

+0

cảm ơn bạn! nhưng bài viết của anh ấy mô tả cách chạy chúng cả khi sử dụng độ phân giải mô-đun runtime systemJS và tôi muốn sử dụng gói webpack để tạo một gói – Michael

+0

Được rồi, tôi hiểu. Đó là vì Angular 1 và Webpack cho Angular2 không tương thích. Cho rằng bạn sẽ cần phải sử dụng một thư viện khác nhau. Nó được đề cập trong github [webpack] (https://github.com/AngularClass/angular2-webpack-starter). Sau đó thử sử dụng [NG6] (https://github.com/angularclass/NG6-starter), tôi không nghĩ rằng nó có các tính năng chính xác giống nhau nhưng nó sẽ thực hiện công việc. – mlk

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