将 Sails Js 与 Angular 2 集成

Posted

技术标签:

【中文标题】将 Sails Js 与 Angular 2 集成【英文标题】:Integrating Sails Js with Angular 2 【发布时间】:2016-05-09 23:13:44 【问题描述】:

我正在尝试将 Angular 2 集成到 Sails Js 应用程序中。我都是新手。我一直在这里关注this官方教程。它在带有静态 http 服务器的独立模式下工作正常,但是当我尝试集成到sails 应用程序中时,我遇到了以下问题:

1 - 我如何在本地 node_modules 文件夹中引用 angular2 js。每次我这样做时,sails 都会将其解释为一条路线,并为我的脚本提供 404。例如:

<script src="node_modules/angular2/dist/angular2.min.js"></script>

我现在可以使用 cdnjs 链接克服上述问题,但我想知道更好/更合适的解决方案。

2 - 我将 tsctsc -w 脚​​本添加到我的 package.json 中,但即使使用 sails lift --verbose 我也没有得到任何输出或错误。这是我将脚本添加到 json 文件的方法:

"scripts": 
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "debug": "node debug app.js",
    "start": "node app.js"

最后我不得不用 -g 安装 typescript 并手动编译。那行得通,但同样,它有望与脚本一起使用。很高兴知道我错过了什么。

3 - 在摆脱了上述错误之后,当我再次提升服务器时,它给了我更多的 404 错误,这似乎来自system.src.js,我无法弄清楚。请参阅下面的控制台屏幕截图。

我想我在 Sails 中设置 Angular 应用程序目录可能会出错。只是为了确保我们涵盖了所有内容,这是我正在使用的目录结构。 Sails 应用程序中还没有任何内容。这就是为什么以下路径仅适用于与角度相关的工件和资产。

在资产文件夹中:

应用程序

│   ├── app.component.ts

│   └── main.ts

当然,.ts 文件会编译为 js。

在sails views 文件夹中,我有layout.ejs,其中包含以下内容:

  .
  .
  .

<script src="https://cdnjs.cloudflare.com/ajax/libs/es6-shim/0.34.2/es6-shim.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.17/system-polyfills.js"></script>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.1/angular2-polyfills.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.17/system.src.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/2.0.0-beta.1/angular2.dev.js"></script>

  <script>

      System.config(
          packages: 
              app: 
                  format: 'register',
                  defaultExtension: 'js'
              
          
      );
      System.import('/app/main')
              .then(null, console.error.bind(console));
  </script>


  .
  .
  .

  <my-app>Loading...</my-app>

除了上述文件,我还在sails根文件夹中添加了tsconfig。

我已遵循 official 快速入门教程中的代码和目录结构指南。

【问题讨论】:

【参考方案1】:

您需要设置对静态文件的访问权限。你可以在这里查看如何。 http://sailsjs.org/documentation/concepts/assets

因此,将这些节点模块放入资产文件夹中,然后您就可以对其进行静态访问。

但是,您确定要使用 Sails 执行此操作吗?据我所知,Sails 是一个成熟的 MVC 框架,如果您只想将其用作 Angular 的后端,您将不需要它。我建议改用 Express 之类的东西。

【讨论】:

我想过,但我不想在里面移动模块,这太费力了,而且不是最好的维护方式,你不觉得吗? 恐怕,这是我知道的唯一方法。 Angular 是一个客户端框架,需要访问这些模块。使用 express,您可以授予对任何目录的访问权限。 是否有某种风帆政策可以让我访问?说类似“如果路由以段'node_modules'不路由开始”? 据我所知,文档没有提到这一点。但是,可能有一种方法可以使用一些自定义中间件。 选择 ejs 或 angular 的主要问题是,如果你想创建你的 html 服务器端或客户端。因此,服务器端模板引擎(ejs、jade、handlebars、mustachej ......)很好很酷,但是如果您决定要将 JSON 从服务器发送到客户端并在客户端呈现这些数据,那么您必须选择angular 或其他一些客户端 js 库【参考方案2】:

所以,对于任何感兴趣的人,我已经解决了这样的问题:

1 - 为了提供对 node_modules 的静态访问,我创建了一个快速中间件(可能也为此使用策略?):

(config/express.js)

var express = require('express');
module.exports.http = 
customMiddleware: function (app) 
    app.use('/node_modules', express.static(process.cwd() + '/node_modules'));
   
;

2 - 我已经可以编译了,一切都很好

3 - 对于 rxjs 相关的错误,我做了一些研究,发现 rxjs 是no longer bundled with angular 2。因此,我不得不稍微修改 systemjs 配置以添加 rxjs 的映射,如下所示:

(views/layout.ejs)

System.config(
          map: 
              rxjs: 'node_modules/rxjs' // added this map section
          ,
          packages: 
              app: 
                  format: 'register',
                  defaultExtension: 'js'
              ,
              'rxjs': defaultExtension: 'js' // and added this to packages
          
      );
System.import('/app/main')
              .then(null, console.error.bind(console));

【讨论】:

【参考方案3】:

您可以使用文件夹node_modules/angular2/bundles中提供的javascript文件:

<script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="node_modules/rxjs/bundles/Rx.js"></script>
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
<script src="node_modules/angular2/bundles/router.dev.js"></script>
<script src="node_modules/angular2/bundles/http.dev.js"></script>

这应该回答你的第一个问题。

关于第二个问题,您放入 scripts 文件的 package.json 块中的元素是命令的别名。 tsc -w 等待 TypeScript 文件中的更新并自动编译它们。此命令必须在后台启动...例如:npm run tsc:w

希望对你有帮助 蒂埃里

【讨论】:

好吧,我已经试过了,又试了一次,但给了我 404 : ""NetworkError: 404 Not Found - "localhost:1337/node_modules/angular2/bundles/…" 我还没有添加任何服务器端路由,只是为了说清楚 根据您的问题,我看到您尝试过node_modules/angular2/dist/... 而不是node_modules/angular2/bundles/...。没有? 没关系,因为它需要在资产文件夹中。 查看我的其他答案。【参考方案4】:

(1)对于第一个问题:

找不到 404 角度文件的问题是,当 Sails 解除 Grunt 时,会删除 .tmp 中的所有文件,然后从头开始重新构建项目,所以发生的情况是 Sails 服务器在构建完成之前启动并且文件不存在为什么会出现 404。如果您稍等片刻,您的页面应该会加载而不会出现任何错误。

如果等待时间过长,请使用 CDN 中的这些脚本:

  <script src="https://rawgithub.com/systemjs/systemjs/0.19.6/dist/system.js"></script>
  <script src="https://code.angularjs.org/tools/typescript.js"></script>
  <script src="https://code.angularjs.org/2.0.0-beta.1/angular2-polyfills.js"></script>
  <script src="https://code.angularjs.org/2.0.0-beta.1/Rx.js"></script>
  <script src="https://code.angularjs.org/2.0.0-beta.1/angular2.dev.js"></script>
  <script src="https://code.angularjs.org/2.0.0-beta.1/router.dev.js"></script>
  <script src="https://code.angularjs.org/2.0.0-beta.1/http.dev.js"></script>

(2) 第二个问题: 像这样在单独的控制台窗口中运行 tsc:

npm run tsc:w

(3) 第三个问题,在需要的组件中添加以下内容:

import 'rxjs/add/operator/map';

【讨论】:

以上是关于将 Sails Js 与 Angular 2 集成的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS +sails.js

如何将 D3.js 与 Renderer API 与 Angular 2 集成

带有护照推特的sails.js

Angular JS 请求远程 Sails 服务器

如何在 Sails.js 中实现连接多方

如何将凉亭组件与sails.js 连接?