2016-10-09 29 views
1

私は巨大なクライアントサイドアプリをAngular 1.xからAngular 2にアップグレードしようとしています。私はダミーで軽量なプロジェクト(以下に貼り付けられたファイル)を使って問題を再現しましたが、最初に問題を説明しましょう。私tsconfig.jsoncommonjsとしてモジュールを指定した場合角度1と2のハイブリッドアプリ - "定義が定義されていません"

は基本的に、私は私のクロムのdevのコンソールで次のエラーを取得する:

app.module.ts:1Uncaught ReferenceError: require is not defined

私はsystemにモジュールを切り替えると、私は次のエラーを取得する:

Uncaught TypeError: Invalid System.register call. Anonymous System.register calls can only be made by modules loaded by SystemJS.import and not via script tags.

モジュールをumdに切り替えると、すべて正常に動作します。しかし、角度自体がcommonjsを使用することを示唆しているので、私はumdが正しい答えではないと懸念しています。しかし、私がそれについて間違っていて、umdが完璧にうまくいけば、私は理由についての良い説明を聞くのが大好きです。

は、ここに私の問題を再現するために私のコードです:

tsconfig.json:

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "system", 
    "moduleResolution": "node", 
    "sourceMap": true, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "removeComments": false, 
    "noImplicitAny": false 
} 
, 
"exclude": [ 
    "node_modules" 
] 
} 

typings.json:

{ 
    "globalDependencies": { 
    "angular": "registry:dt/angular#1.5.0+20160922195358", 
    "core-js": "registry:dt/core-js#0.0.0+20160725163759", 
    "jasmine": "registry:dt/jasmine#2.2.0+20160621224255", 
    "jquery": "registry:dt/jquery#1.10.0+20160929162922", 
    "node": "registry:dt/node#6.0.0+20160909174046" 
    } 
} 

systemjs.config.js:

(function (global) { 
    System.config({ 
    paths: { 
     // paths serve as alias 
     'npm:': 'node_modules/' 
    }, 
    // map tells the System loader where to look for things 
    map: { 
     // our app is within the app folder 
     app: 'app', 
     // angular bundles 
     '@angular/core': 'npm:@angular/core/bundles/core.umd.js', 
     '@angular/common': 'npm:@angular/common/bundles/common.umd.js', 
     '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js', 
     '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', 
     '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', 
     '@angular/ ': 'npm:@angular/http/bundles/http.umd.js', 
     '@angular/router': 'npm:@angular/router/bundles/router.umd.js', 
     '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', 
     // other libraries 
     'rxjs':      'npm:rxjs', 
     'angular-in-memory-web-api': 'npm:angular-in-memory-web-api', 
    }, 
    // packages tells the System loader how to load when no filename and/or no extension 
    packages: { 
     app: { 
      main: './main.js', 
      defaultExtension: 'js' 
     }, 
     rxjs: { 
      defaultExtension: 'js' 
     }, 
     'angular-in-memory-web-api': { 
      main: './index.js', 
      defaultExtension: 'js' 
     } 
    } 
}); 
})(this); 

package.json:

{ 
"name": "mattsApp", 
"version": "0.0.1", 
"dependencies": { 
"angular": "^1.5.8", 
"@angular/common": "~2.0.2", 
"@angular/compiler": "~2.0.2", 
"@angular/core": "~2.0.2", 
"@angular/forms": "~2.0.2", 
"@angular/http": "~2.0.2", 
"@angular/platform-browser": "~2.0.2", 
"@angular/platform-browser-dynamic": "~2.0.2", 
"@angular/router": "~3.0.2", 
"@angular/upgrade": "~2.0.2", 
"angular-in-memory-web-api": "~0.1.5", 
"bootstrap": "^3.3.7", 
"core-js": "^2.4.1", 
"reflect-metadata": "^0.1.8", 
"rxjs": "5.0.0-beta.12", 
"systemjs": "0.19.39", 
"zone.js": "^0.6.25" 
}, 
"devDependencies": { 
    "concurrently": "^3.0.0", 
    "lite-server": "^2.2.2", 
    "typescript": "^2.0.3", 
    "typings":"^1.4.0" 
}, 
"scripts": { 
    "start": "tsc && concurrently \"tsc -w\" \"lite-server\" ", 
    "lite": "lite-server", 
    "postinstall": "typings install", 
    "tsc": "tsc", 
    "tsc:w": "tsc -w", 
    "typings": "typings" 
} 
} 

app.js:

angular.module('app', []); 

app.module.ts:

import { NgModule }  from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { upgradeAdapter } from './upgrade_adapter'; 

@NgModule({ 
    imports:  [ BrowserModule ] 
}) 
export class AppModule { } 

upgradeAdapter.bootstrap(document.body, ['app'], {strictDi: true}); 

appCtrl.ts:

angular.module('app') 
    .controller('appCtrl', ['$scope', function($scope) { 
     $scope.hello = "howdy worldy"; 
    }]); 

upgrade_adapter.ts:

import { UpgradeAdapter } from '@angular/upgrade'; 
import {AppModule} from "./app.module"; 
export const upgradeAdapter = new UpgradeAdapter(AppModule); 

私には何が欠けていますか?

答えて

0

まず、感謝アンドレスをインポートする必要があります。私は、それが何をするのかを理解するためにforwardRefについて少しお読みになる必要があります。しかし、私の特別なケースでの答えは何か違っていたことが判明しました。

私はindex.htmlをここに掲載しませんでしたが、問題はモジュールにSystem.import( 'app')をロードしていないことでした。恥ずかしいエラー、私は認めなければならない。その答えはその行を追加することです。

これは私が解決した別のエラーにつながったことに注意してください。しかし、他の人にも同様の問題がある場合にはここで指摘します。これはハイブリッド角度1と2のアプリケーションなので、私は、角度1のコントローラ/指令/ etcや角度2のコンポーネントで時々使用されるタイプスクリプトファイルを持っています。これらのタイプスクリプトファイルをエクスポートを使用するように変更して、それらを角2のコンポーネントにインポートすることができました。これにより、角度1のファイルで///を変更してインポートを使用するようになりました。残念ながら、これは私に "undefinedModule"エラーを与えました。解決策(私の場合)は、角度2のコンポーネントでのみ使用されている場合を除き、タイプスクリプトファイルでエクスポートを使用することはありません。意味、いくつかの角度2のコンポーネントでは、私は実際に///を使用していますが、インポートは使用していません。

他の人にも役立つかもしれないと思っただけです。

0

null以外のパラメータでUpgradeAdapterをインスタンス化する必要があります。あなたがforwardRefインスタンスを渡す必要がある。このように、このような何か:

const upgradeAdapter = new UpgradeAdapter(forwardRef(() => AppModule)); 

最後に、あなたはforwardRef

import {NgModule, forwardRef} from '@angular/core'; 
関連する問題