- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们开发了使用以下技术的企业应用程序:
一开始我们对所有这些插件和东西感到非常满意,但是随着应用程序的不断增长,所有代码变得非常困惑(每个页面上都有很多 jQuery 选择器/代码)并且没有遵循正确的模式用于前端开发。
现在,我们决定投入一些时间来改进应用程序并清理一些东西。我们已经完成了初步的 RnD,并计划转向 AngularJS,但我们不会将其做成 SPA(因为它是一个企业应用程序,也存在一些大数据和安全问题)。我们只想排除所有上述依赖库,并使用单个 AngularJS 来实现所有这些,并分离我们的 HTML/CSS/Javascript(这将使其更易于维护)。
我们做出的决定正确吗?迁移到 AngularJS 是一个好的选择吗?我们应该限制开发人员遵循一些特定的模式(例如模块模式)进行前端开发?
如果您有相关经验,请建议更好的选择。
谢谢。
最佳答案
我在一家咨询公司工作,该公司目前正在构建一个庞大的 enterprise application using Angular.js ,我可以明确地说 Angular 非常适合企业。
我们的堆栈概要以及 Angular 应用程序的大小:
服务器:
ASP.Net MVC
ASP.Net WebAPI
客户:
Angular.js
剑道用户界面
下划线.js
Angular 统计:
Controller :213
服务:59
指令:130
试图涵盖我们使用的每一项技术会花费太长时间,但我会向您介绍几个我认为是我们成功的关键的重要领域。
TypeScript 是我们成功的重要组成部分。早期我们使用 vanilla JS,并依靠模块和 Require.js 等可靠实践来保持事物的可维护性。然而,随着团队规模的扩大,我们开始互相踩踏。
转向 TypeScript 为我们提供了必要时所需的预处理器类型检查。由于 TypeScript 是 JavaScript 的 super 集,因此我们仍然能够在必要时编写普通 JS,但添加的类型信息和环境工具极大地提高了生产力。
另一个好处是 TypeScript 基于 ES6,因此它可以帮助我们使代码向前兼容。
由于大多数企业应用程序都有许多不同的领域,因此我们尝试将其全部插入 SPA 中是不现实的。但是,我们也不希望对每个屏幕进行整页重新加载。
我们的最终解决方案是对管理员、用户等主要区域进行全页面刷新...并且每个区域都有自己的 Angular 模块并充当 SPA。我们将其称为混合 SPA,因为它就像一堆小 SPA 形成一个有凝聚力的整体。
最初我们使用 Require.js,但我们选择使用 ASP.Net Bundler。这并不是对 Require 的打击,而是我们不想与我们正在使用的堆栈作斗争。
ASP.Net bundler 非常适合我们,我们还添加了一些智能功能来自动为我们构建单独的页面 bundle 。
在许多企业应用程序中,安全性和用户管理往往非常微妙。我们有一些相当复杂的安全要求,最初将它们纳入 SPA 中有点令人担忧。
显然我们的后端服务都被锁定了,但是前端呢?
Angular 的好处在于它可以非常轻松地通过特殊行为进行增强。最后,我们最终利用 $routeProvider
上的 resolve
属性在加载 View 之前加载用户的权限。路由如下所示:
.when('/foo/bar', {
templateUrl: '/users/view',
controller: 'UsersCtrl',
permissions: ['usersView','usersEdit'],
resolve: checkUserPermissions
});
resolve
实际上是动态添加的,但这值得写一整篇博客文章。最终结果是,如果用户没有查看应用程序该区域的适当权限,我们可以使路由失败并采取操作。
同样,这纯粹是装饰性的,因为所有安全检查都是在服务器上完成的,但它确实使应用程序保持良好和一致,以便在用户没有权限时能够显示“无访问” View 。
Angular.js 非常适合企业应用程序,事实上,与使用更传统的 Web 堆栈相比,它可以帮助您提供更好的体验。
关于jquery - 在企业应用程序中使用 angularJS 而不是(jquery + jqTemplate+jqValidationEngine+jqGrid),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23081325/
我是 C 语言新手,我编写了这个 C 程序,让用户输入一年中的某一天,作为返回,程序将输出月份以及该月的哪一天。该程序运行良好,但我现在想简化该程序。我知道我需要一个循环,但我不知道如何去做。这是程序
我一直在努力找出我的代码有什么问题。这个想法是创建一个小的画图程序,并有红色、绿色、蓝色和清除按钮。我有我能想到的一切让它工作,但无法弄清楚代码有什么问题。程序打开,然后立即关闭。 import ja
我想安装screen,但是接下来我应该做什么? $ brew search screen imgur-screenshot screen
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将
我有一个 shell 脚本,它运行一个 Python 程序来预处理一些数据,然后运行一个 R 程序来执行一些长时间运行的任务。我正在学习使用 Docker 并且我一直在运行 FROM r-base:l
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将
对于一个类,我被要求编写一个 VHDL 程序,该程序接受两个整数输入 A 和 B,并用 A+B 替换 A,用 A-B 替换 B。我编写了以下程序和测试平台。它完成了实现和行为语法检查,但它不会模拟。尽
module Algorithm where import System.Random import Data.Maybe import Data.List type Atom = String ty
我想找到两个以上数字的最小公倍数 求给定N个数的最小公倍数的C++程序 最佳答案 int lcm(int a, int b) { return (a/gcd(a,b))*b; } 对于gcd,请查看
这个程序有错误。谁能解决这个问题? Error is :TempRecord already defines a member called 'this' with the same paramete
当我运行下面的程序时,我在 str1 和 str2 中得到了垃圾值。所以 #include #include #include using namespace std; int main() {
这是我的作业: 一对刚出生的兔子(一公一母)被放在田里。兔子在一个月大时可以交配,因此在第二个月的月底,每对兔子都会生出两对新兔子,然后死去。 注:在第0个月,有0对兔子。第 1 个月,有 1 对兔子
我编写了一个程序,通过对字母使用 switch 命令将十进制字符串转换为十六进制,但是如果我使用 char,该程序无法正常工作!没有 switch 我无法处理 9 以上的数字。我希望你能理解我,因为我
我是 C++ 新手(虽然我有一些 C 语言经验)和 MySQL,我正在尝试制作一个从 MySQL 读取数据库的程序,我一直在关注这个 tutorial但当我尝试“构建”解决方案时出现错误。 (我正在使
仍然是一个初学者,只是尝试使用 swift 中的一些基本函数。 有人能告诉我这段代码有什么问题吗? import UIKit var guessInt: Int var randomNum = arc
我正在用 C++11 编写一个函数,它采用 constant1 + constant2 形式的表达式并将它们折叠起来。 constant1 和 constant2 存储在 std::string 中,
我用 C++ 编写了这段代码,使用运算符重载对 2 个矩阵进行加法和乘法运算。当我执行代码时,它会在第 57 行和第 59 行产生错误,非法结构操作(两行都出现相同的错误)。请解释我的错误。提前致谢:
我是 C++ 的初学者,我想编写一个简单的程序来交换字符串中的两个字符。 例如;我们输入这个字符串:“EXAMPLE”,我们给它交换这两个字符:“E”和“A”,输出应该类似于“AXEMPLA”。 我在
我需要以下代码的帮助: 声明 3 个 double 类型变量,每个代表三角形的三个边中的一个。 提示用户为第一面输入一个值,然后 将用户的输入设置为您创建的代表三角形第一条边的变量。 将最后 2 个步
我是新来的,如果问题不好请见谅 任务:将给定矩阵旋转180度 输入: 1 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出: 16 15 14 13 12 11
我是一名优秀的程序员,十分优秀!