把angular项目整合到.net mvc中

 

之前的开发选择的是完全舍弃服务端,仅保留最简单web服务器提供angular经打包的静态资源,此外所有的业务与数据请求都访问一个分离的WebApi来实现。不过最近碰到一个需求,有必要使用多个客户端,而各客户端本身都是webpack打包出来的js而已,没必要每个客户端都自己建一个站点,这就有必要搭建一个服务端,根据参数动态渲染不同客户端的脚本来服务多个客户端了。主要需要解决两个问题,一是防止前后端路由冲突各自有效工作,二是如何实现一套比较合理的部署方案。笼统一点看待这个问题,无非就是要实现如题目所描述的,如何将专注前端的强大框架(angular)整合到一个健壮的现有服务端(.Net)项目中去。

Webpack配置

第一步必然是要先得到前端项目的打包资源,由强大的webpack来完成,目标是将angular的所有依赖以及应用主代码分别打包到polyfill.js、vendor.js、main.js三个脚本中,以及异步懒加载的模块各自打包成一个chunk.js。webpack博大精深,刚接触会摸不着头脑,好在其终究是用来给我们带来方便的一个工具而已,使用起来是很有条理的。其主要的介绍可以移步webpack的官方文档【https://doc.webpack-china.org 】,认真吸收完远远足够写出angular-webpack-starter【 https://github.com/AngularClass/angular-starter 】这样完善的启动项目来了。
简单来说webpack配置有四部曲:

  • 一、 定义入口文件 包含angular的依赖,angular框架代码以及项目的启动代码即可,比如angular-webpack-starter中的配置:
entry: {
'polyfills': './src/polyfills.browser.ts', // 依赖项
'main': AOT ? './src/main.browser.aot.ts' : './src/main.browser.ts' // 主程序
},
  • 二、 定义打包规则

打包规则有好一些需要配置的,包括了各种文件类型的打包,angular模块的打包等,配置方式见官方文档或直接参照现成的启动项目,直接看难免懵逼,但不要怕,规则其实就那么点,眼熟就成功了大半。

  • 三、配置插件

webpack有非常多的插件,用来强化打包能力以及规则的扩展,可以看看启动项目中用到了哪些,这些插件在官方文档里都能找到介绍。

  • 四、 定义输出规则

输出要分生产环境和开发环境,本文只讲生产环境。先明确webpack打包好的项目是要交给服务端使用的,给出的输出要有几个需求: 1) 转义兼容浏览器和ES5并压缩。2)输出文件名附带哈希值,代码发生更改重新打包时要有不同的哈希值,保证此时替换的资源不会被浏览器缓存而得不到第一时间更新。3)列出资源打包清单,因为附带了哈希值导致每次文件名都是很长一串奇怪字符,使用合适的webpack配置附带一个manifest清单列出都输出了哪几个文件,进一步在使用时动态读取其中的清单来操作输出的文件。

作为静态脚本添加到服务端

顺利的话开发完成的项目能得到类似下图的打包资源:

其中webpack-assets.json中列出了三个依赖文件:

以0、1、2、3打头的四个chunk文件是由angular动态引入的懒加载模块,不需要手动引入自然也不需要列出来,只需要保证angular能访问到它们即可。
把这些东西全都放到一个.Net MVC项目中去:

然后在View视图中引入三个脚本并配置base url:

现在运行MVC项目,定位到这个视图可以顺利渲染出angular项目来。问题在于手动输入前端路由的url时,此url会被MVC路由视为404错误(因为MVC路由中确实未定义这一规则,真正使用此规则的angular客户端还没有机会解析这个url就被一个错误页取代了)。

MVC路由配置

angular官方给出的指南是给服务端配置404的重定向,将所有的404错误都重定向到index.html,这样前端就能顺利开始解析输入的url了。在MVC中做法也类似,只要在MVC的路由规则中,将必要路由(比如还定义了其他的Api或者错误页)之外的所有请求都指向指定的Action,比如笔者的这条规则,将所有其他请求都指向AppController下的Index:

这样除了/page/打头的url外所有不满足默认路由的请求都会定位到/App/Index。

使用MVC的View取代index.html

下一步是要在这个/App/Index中读取前端打包生成的webpack-assets.json清单,将需要的文件渲染到视图中,笔者项目添加了一个academyid来区分多客户端,每个客户端都有以自己id命名的一个资源目录,实现如下图所示:

笔者的C#比较抠脚,所以定义了一个class来解析json文件,然后才把解析到的文件名放到ViewData中以供前端使用。现在视图中就可以使用Razer语法来渲染脚本依赖:

这样子配置下来,服务端其实不需要再关心客户端的更改,只关心从webpack-assets.json中解析要加载的依赖,并渲染这些依赖即可,每当客户端代码更改重新打包时,webpack-assets.json清单也会更新,毫不影响服务端。

总结

水平有限导致本文存在许多的不足之处,包括一直未涉及的SEO方案以及其他的隐藏问题,笔者还有很多需要学习完善的地方。

net mvc中angular的更多相关文章

  1. angular.js的路由和模板在asp.net mvc 中的使用

    angular.js的路由和模板在asp.net mvc 中的使用 我们知道angular.js是基于mvc 的一款优秀js框架,它也有一套自己的路由机制,和asp.net mvc 路由不太一样.as ...

  2. 把angular项目整合到.net mvc中

    之前的开发选择的是完全舍弃服务端,仅保留最简单web服务器提供angular经打包的静态资源,此外所有的业务与数据请求都访问一个分离的WebApi来实现.不过最近碰到一个需求,有必要使用多个客户端,而 ...

  3. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

  4. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  5. AngularJS的MVC中C的实现

    Angular的MVC中C的实现 注:在controller操作Dom效率是很低的,我们使用封装的指令去操作Dom

  6. 如何在 ASP.NET MVC 中集成 AngularJS(1)

    介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...

  7. MVC 中集成 AngularJS1

    在 ASP.NET MVC 中集成 AngularJS(1)   介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 R ...

  8. 【转】asp.net mvc webapi+angular.js案例

    参考地址:http://www.mamicode.com/info-detail-892383.html 大家好,本文用一个简单的demo演示AngularJS在MVC中的使用,在学习这个demo之前 ...

  9. asp.net MVC中防止跨站请求攻击(CSRF)的ajax用法

    参考: Preventing Cross-Site Request Forgery (CSRF) AttacksValidating .NET MVC 4 anti forgery tokens in ...

随机推荐

  1. python_面向对象魔法方法指南

    原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英文版) Repo: https://gi ...

  2. linux、windows搭建nginx出现问题集锦

    1.启动提示端口被占用(linux) 启动ninx出现nginx: [emerg] bind() to0.0.0.0:80 failed (98: Address already in use) ne ...

  3. matlab calibration toolbox -- matlab标定工具的使用方法--去畸变和双目校正

    matlab calibration toolbox -- matlab标定工具的使用方法--去畸变和双目校正 2015-04-06 22:45 5407人阅读 评论(2) 收藏 举报  分类: 机器 ...

  4. 51nod 1450 闯关游戏

    首先肯定要先把所有的关卡打通后去找两星几率最大的关卡刷星(论打游戏经验的重要性). 所以从两星几率小的关打起,记录当前拿到x个星星的几率和当前走过的期望步数,如果发现剩下的关必须全两星,就直接计算答案 ...

  5. Java 使用 Enum 实现单例模式

    在这篇文章中介绍了单例模式有五种写法:懒汉.饿汉.双重检验锁.静态内部类.枚举.如果涉及到反序列化创建对象时推荐使用枚举的方式来实现单例,因为Enum能防止反序列化时重新创建新的对象.本文介绍 Enu ...

  6. 【转】如何学习android开发

    1.Java基础 很多朋友一上手就开始学习Android,似乎太着急了一些.Android应用程序开发是以Java语言为基础的,所以没有扎实的Java基础知识,只 是机械的照抄别人的代码,是没有任何意 ...

  7. Pycharm使用详解

    Pycharm使用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 古人云,工欲善其事,必先利其器.想要学好Python且拥有高效的开发效率,这个时候每个程序员都有自己的开发方式 ...

  8. ActiveMQ Transport Connectors

    一,介绍 ActiveMQ的Transport Connectors 是什么? ActiveMQ是一个消息服务器.作为消息服务器,就会有生产者和消费者来使用它.生产者将消息发送给ActiveMQ,消费 ...

  9. ASP.NET MVC3-Music Store中英文教程 [下载]

    翻译原文档名: MVC Music Store版本: ASP.NET MVC3概述Mvc Music Store 是一个为WEB开发人员一步一步介绍和解释如何使用MVC和Visual Web开发的应用 ...

  10. tensorflow随机张量创建

    TensorFlow 有几个操作用来创建不同分布的随机张量.注意随机操作是有状态的,并在每次评估时创建新的随机值. 下面是一些相关的函数的介绍: tf.random_normal 从正态分布中输出随机 ...