【问题标题】:mean stack routing for large application大型应用程序的平均堆栈路由
【发布时间】:2016-11-25 22:34:36
【问题描述】:

我正在构建一个非常大的应用程序。我来自 PHP 和 jQuery,可能是我的逻辑错误,请帮助我。

我想有一个自定义的模块化结构,有前端的客户端文件夹和后端的服务器,具有分离的视图。 后端当然是在nodejs上搭建的,有mongoDb,jade会换成pug,暂时不是很重要。

让我们这样说吧。

├── client
│   ├── clients
│   │   ├── directives
│   │   ├── filters
│   │   ├── main.js
│   │   └── services
│   └── tasks
│       ├── directives
│       ├── filters
│       ├── main.js
│       └── services
├── server
└── views
    ├── clients
    │   ├── form.jade
    │   ├── index.jade
    │   └── list.jade
    ├── clients.jade
    ├── index.jade
    ├── layout.jade
    ├── tasks
    │   ├── form.jade
    │   ├── index.jade
    │   └── list.jade
    └── tasks.jade

tasks.jade、clients.jade 和 index.jade 会有用于特定目的的 ng-view 和 js 文件。这个想法是不要在 index.jade 中加载所有 js 文件,因为我认为这会影响性能并且它会更干净。

视图中的 index.jade 如下所示:

extends layout

block body
  h1 HTML5 Route Example
  div(ng-view)

  script(src='lib/angular/angular.js')
  script(src='lib/angular-route/angular-route.js')
  script(src='javascripts/app.js')
  script(src='javascripts/services.js')
  script(src='javascripts/controllers.js')
  script(src='javascripts/filters.js')
  script(src='javascripts/directives.js')

views/contact.jade

extends layout

block body
  h1 HTML5 Route Example - contact
  div(ng-view)

  script(src='lib/angular/angular.js')
  script(src='lib/angular-route/angular-route.js')
  script(src='javascripts/app.js')
  script(src='javascripts/contact/services.js')
  script(src='javascripts/contact/controllers.js')
  script(src='javascripts/contact/filters.js')
  script(src='javascripts/contact/directives.js')

views/tasks.jade

extends layout

block body
  h1 HTML5 Route Example - contact
  div(ng-view)

  script(src='lib/angular/angular.js')
  script(src='lib/angular-route/angular-route.js')
  script(src='javascripts/app.js')
  script(src='javascripts/tasks/services.js')
  script(src='javascripts/tasks/controllers.js')
  script(src='javascripts/tasks/filters.js')
  script(src='javascripts/tasks/directives.js')

这是我正在努力解决的部分:由于部分将被加载到特定页面的 ng-views,我应该有带有重定向的路由,但是这样我需要一个然后加载部分,这不起作用我喜欢的方式。

routing bellow 是我使用的路由的一个非常简化的部分,实际上在实际应用中,它是为任务、客户端、...分开的。

app.config(function($routeProvider, $locationProvider) {
  $locationProvider.html5Mode(true);
  $routeProvider
    .when("/", {
      templateUrl: "partials/index",
      controller: "MainController"
    })
    .when("/about", {
      templateUrl: "partials/about",
      controller: "AboutController"
    })
    .when("/contacts", {
      templateUrl: "contacts/index",
      controller: "ContactsController",
      ...
    })
    .when("/contacts/:id", {
      templateUrl: "contacts/list",
      controller: "ContactsController",
      ...
    })
    .when("/tasks", {
      templateUrl: "tasks/index",
      controller: "TasksController",
      ...
    })
    .when("/tasks/:id", {
      templateUrl: "tasks/list.jade",
      controller: "TasksController",
      ...
    })

    ....
    .otherwise( { redirectTo: "/" });
});

如果我这样使用,这些视图只能加载到views/index.jade,并且如前所述,我希望将它们分开,因此我尝试了这种方式 - 使用重定向,它不会在我看来,这是一种很好的做法:

app.config(function($routeProvider, $locationProvider) {
  $locationProvider.html5Mode(true);
  $routeProvider
    .when("/", {
      templateUrl: "partials/index",
      controller: "MainController"
    })
    .when("/about", {
      templateUrl: "partials/about",
      controller: "AboutController"
    })
    .when("/contacts", {
      redirectTo: /contacts
    })
    .when("/contacts/:id", {
      templateUrl: "contacts/list",
      controller: "ContactsController",
      ...
    })
    .when("/tasks", {
      templateUrl: "tasks/index",
      controller: "TasksController",
      ...
    })
    .when("/tasks/:id", {
      templateUrl: "tasks/list",
      controller: "TasksController",
      ...
    })

    ....
    .otherwise( { redirectTo: "/" });
});

有不同的方法吗?我尝试了不同的方法,但都没有达到我想要的效果。

请注意,这是非常简化的介绍,我对堆栈非常陌生,仍在尝试学习最佳实践。

更新:这个应用程序已经在运行,可以在这里看到初稿(它还不是模块化的)https://github.com/tesis/meanstack

【问题讨论】:

    标签: angularjs node.js pug mean-stack


    【解决方案1】:

    所以这是第一次使用 MEAN 堆栈时的常见问题。

    这个想法是后端路由 vs 单页应用程序

    因此,当我加载 www.website.com:9000/tasks 时,您可以让您的 Express 在后端加载 tasks.jade 文件,它会。该页面将加载,现在您正在运行一个 Angular 应用程序。

    一旦您进入 Angular 应用程序,您就可以使用 ngRoute,它为您提供$routeProvider 在页面之间路由的能力...实际上您正在做的是加载一个没有初始值的 HTML 页面内容和你的网址看起来像www.website.com:9000/tasks/#/ 所以你可以做的就是说有它

    .when("/about", {
      templateUrl: "partials/about",
      controller: "AboutController"
    })
    

    这只是说当 url 是 www.website.com:9000/tasks/#/about 时,你想在你的特殊 div 标签中注入 HTML(可能看起来像 <ng-view></ng-view>,这个标签是放置 HTML 的地方。控制器是你想要的 javascript在该 HTML 上运行,这允许您在两个不同的控制器中使用相同的函数名称、变量等的 javascript,而不必担心它们在 HTML 视图之间发生冲突。

    回到正题 - 您想要加载您的 clients.jade 文件,您需要“刷新”页面,因为您必须转到您的 Node.js 网络服务,询问/请求www.website.com:9000/clients 的页面,它将加载整个 Angular 单页应用程序。这不是$routeProvider 部分完成的,这是一个简单的<a href='/clients'></a> 或javascript window.location('/client');


    这更像是一个设计问题。您希望用户打开一个新页面还是让他们保持在同一页面上。如果您选择相同的页面,那么您应该在您的快速布局中拥有一个视图,并且只需在一个 Angular 应用程序中完成所有操作。如果你使用新的页面路由,那么你开始打破 ng-routing 的原因,只是制作一堆静态网页。两者都不是正确的答案,这实际上取决于您要完成的工作

    【讨论】:

    • @FickerFresh,感谢您的回答。我知道这里的逻辑不同,这个应用程序已经在运行,但我想念的是加载另一个页面,其中包含与该页面相关的所有 JS。在现有应用程序中,我有一个带有 ng-view 的 index.html,但我想分离那些众多的 JS 文件,除非我用 nodejs 重新加载页面,否则这是不可能的(我不需要 window.location ) .由于 meanstack 应用程序旨在成为 SPA 应用程序,因此我尝试仅将页脚与 JS 文件分开,但它当然没有用。因此,我有这个想法用 ng-views 分隔页面
    • @AngelM。 Jade 是一个 ExpressJS 引擎,它实际上只会获取您要加载的 .jade 页面,将其转换为字符串,并用普通 HTML 替换语法设置 如果您担心分离 JS 文件,您可以制作一个 taskController.js和contactController.js 文件,让它们都创建一个链接到角度模块的控制器,并让您将它们分开。这就是你的目的吗?
    • @FickerFresh,Jade 是一个模板引擎,与 PHP、nodejs 等一起使用,您也可以将它与 Angular 一起使用。这个应用程序现在作为一个 meanstack 应用程序运行,但也将在 Laravel 中为 LAMP 堆栈配置(它也使用翡翠),所以我坚持使用相同的模板引擎。我已经拥有了所有这些控制器,但我感兴趣的是将这些 JS 文件分离出来,动态加载它们,这就是我苦苦挣扎的地方。你会如何在一个模块中做到这一点?我尝试动态加载JS文件,但没有成功。
    • @AngelM。让我确保我理解了这个问题,您是否只想从服务器加载控制器 js 文件以便您的网页在实际使用控制器时查看?就像不是一次将它们全部加载在一起
    • @FrickerFresh,我更新了代码(添加了任务和联系人视图的内容)。因此:如果我点击联系人,应该加载views/contact.jade,点击任务views/tasks.jade 应该加载。我试图分离模块,创建带有路由的联系人模块,注入 myApp 模块,但这种方式不起作用(当然,因为它被视为 SPA 应用程序)。这样做,点击联系人,view/contact/index.jade 被加载,但在views/index.jade 中而不是views/contact.jade。这有可能吗?
    【解决方案2】:

    我想通了:可以通过延迟加载来解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2018-02-15
      • 1970-01-01
      • 2017-11-28
      • 2018-07-13
      • 1970-01-01
      相关资源
      最近更新 更多