【问题标题】:Angular2 with RequireJSAngular2 与 RequireJS
【发布时间】:2016-06-02 12:06:02
【问题描述】:

在将 RequireJS 合并到应用程序时,我无法正确加载 Angular2。

为简单起见,我在 Angular2 上使用非常简单的 Hello World Javascript 教程:https://angular.io/docs/js/latest/quickstart.html

我让这个系统使用 Angular1 运行良好,但我似乎无法使用 Angular2 复制这种成功。

这是我的 index.html 文件:

<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 文件:

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

    baseUrl: '/',

    paths: requirePathsAndShim.paths,

    shim: requirePathsAndShim.shim,

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

});

我使用 requiredPathsAndShim.js 文件来加载我看到的启动 Angular2 应用程序所需的所有依赖项。这是文件:

"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);

然后我从我的“required.config”文件中加载“app/main”文件,该文件将加载 Angular2 的引导功能:

"use strict";

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

app/app.component 文件是一个简单地返回我的 Angular2 组件的文件,该组件被传递到 main.js 引导函数以启动应用程序。这是文件:

"use strict";

(function() {
    define([

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

我已经玩了几个小时了,但似乎无法正常工作。谁能指出我为什么这不起作用的正确方向?我感觉需要将一些 shims 添加到 require.config 中,但到目前为止我还没有成功设置脚本加载依赖项。

谢谢

【问题讨论】:

  • 我知道你不想听到这个,但是如果你将 System 或 WebPack(甚至 Browserify)与 Angular2 一起使用,你将会轻松很多。系统也支持异步延迟加载。此外,您可能希望考虑将 ES6 模块语法与 TypeScript 一起使用,因为它允许您编写一次模块导入,并针对您选择的任何模块系统。这将您的代码与特定的模块系统分离。
  • @martin,我需要做同样的事情,因为我们现有的系统使用 requirejs 并且不介意使用系统,但我认为最好从现有代码加载,因为 angular1 和 angular2 将是 co -host在一起,直到angular1被完全删除。
  • 我有同样的问题 - 我尝试使用 RequireJS 运行 Angular2 应用程序。但请注意,对于 RequireJS 加载某些文件,该文件需要采用 AMD 语法,这意味着该文件需要写入 define([], function(){ ... }) 块中。然而,Angular2 的脚本是用不同的语法编写的——使用 import/export 语句。因此 Require 无法加载它们,并且导出关键字(在 Angular2 脚本中)在导出关键字上抛出错误 - 意外字符。

标签: angular requirejs


【解决方案1】:

您尝试做的事情是不可能的(好吧,在软件工程中,就像在艺术中一​​样 - 一切皆有可能,但要实现这一点,您需要编辑 angular 的脚本,我们不希望这样) .

与使用 ECMAScript5(深受喜爱的 JavaScript 语言)开发的 Angular1 不同,Angular2 是使用 ECMAScript6(和 TypeScript)开发的。

其中一个区别是,在 ECMAScript5 中,为了加载脚本文件(.js、.ts 等),我们需要添加一个带有 src 属性的 &lt;script&gt; 标签,它指向脚本文件。 另一种方法是使用第三方库,它异​​步加载脚本(此类库的示例是:RequireJSWebPackSestemJS 等)。

RequireJS 的主要缺点是它只适用于以 AMD 格式(异步模块定义)编写的脚本,例如:

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

这种语法在使用 Angular1 和 RequireJS 时非常有效。

现在,当我们查看 Angular2 库时,我们可以看到它不是用 AMD 语法编写的,这意味着它无法使用 RequireJS 加载 - 无需将代码重写为 AMD 格式。 Angular2 期待您使用某种 universal 模块加载器。这里的关键字是universal,意思是可以加载各种脚本格式(AMD模块、CommonJS模块和ES6模块)的模块加载器。通用模块加载器的示例有:WebPack 和 SystemJS。

现在让我们谈谈您的问题的解决方案,我相信您需要从 RequireJS 迁移到 Webpack - 因为迁移并没有那么复杂。

第 1 步 - 第 3 方库

当使用 RequireJS 加载 3rd 方库时,我们使用的是 RequireJS 的 pathshims,可以很容易地转换为 Webpack 的 alias。但这不是必需的:一旦你使用了 Webpack,你就有了 npm 支持。这意味着您可以运行 npm install library-name,现在您可以在没有 RequireJS 的情况下使用这个库。

第 2 步 - 应用程序脚本

幸运的是,我们几乎不需要在这里做任何事情。由于 Webpack 是一个通用的模块加载器,它可以加载 AMD 格式的脚本。所以所有以 RequireJS 格式开发的应用程序脚本,都可以使用 Webpack 加载,无需任何更改。

有关如何从 RequireJS 迁移到 Webpack 的更多信息,请参阅这篇文章:https://gist.github.com/xjamundx/b1c800e9282e16a6a18e

【讨论】:

    【解决方案2】:

    我遇到了与@devoncrazylegs 相同的问题..

    我的解决方案:在 tsconifg.ts 中配置 require.config() 中使用的路径数组 --> compilerOptions-->paths

    阅读以下链接以了解更多信息

    https://www.typescriptlang.org/docs/handbook/module-resolution.html#base-u

    【讨论】:

      猜你喜欢
      • 2016-03-30
      • 2016-12-28
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2012-02-15
      • 2012-04-14
      • 2015-02-26
      • 1970-01-01
      相关资源
      最近更新 更多