将angular.js项目整合到.net mvc中的方法详解


Posted in Javascript onJune 29, 2017

前言

之前的开发选择的是完全舍弃服务端,仅保留最简单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清单列出都输出了哪几个文件,进一步在使用时动态读取其中的清单来操作输出的文件。

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

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

将angular.js项目整合到.net mvc中的方法详解

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

将angular.js项目整合到.net mvc中的方法详解 

以0、1、2、3打头的四个chunk文件是由angular动态引入的懒加载模块,不需要手动引入自然也不需要列出来,只需要保证angular能访问到它们即可。

把这些东西全都放到一个.Net MVC项目中去:

将angular.js项目整合到.net mvc中的方法详解 

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

将angular.js项目整合到.net mvc中的方法详解 

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

MVC路由配置

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

将angular.js项目整合到.net mvc中的方法详解 

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

使用MVC的View取代index.html

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

将angular.js项目整合到.net mvc中的方法详解

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

将angular.js项目整合到.net mvc中的方法详解 

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

总结

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

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
Oct 25 Javascript
javascript分页代码(当前页码居中)
Sep 20 Javascript
JavaScript使用focus()设置焦点失败的解决方法
Sep 03 Javascript
Jquery实现动态切换图片的方法
May 18 Javascript
详解JavaScript ES6中的Generator
Jul 28 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
JavaScript简单实现弹出拖拽窗口(一)
Jun 17 Javascript
详解JavaScript的BUG和错误
May 07 Javascript
layui table 参数设置方法
Aug 14 Javascript
JavaScript实现小球沿正弦曲线运动
Sep 07 Javascript
小程序server请求微信服务器超时的解决方法
May 21 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
Mar 06 Javascript
详解webpack和webpack-simple中如何引入css文件
Jun 28 #Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
Jun 28 #jQuery
VUE利用vuex模拟实现新闻点赞功能实例
Jun 28 #Javascript
Vuex利用state保存新闻数据实例
Jun 28 #Javascript
微信浏览器禁止页面下拉查看网址实例详解
Jun 28 #Javascript
基于EasyUI的基础之上实现树形功能菜单
Jun 28 #Javascript
webpack学习--webpack经典7分钟入门教程
Jun 28 #Javascript
You might like
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
2015/03/25 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
在Python中使用第三方模块的教程
2015/04/27 Python
python文件名和文件路径操作实例
2017/09/29 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
Django 视图层(view)的使用
2018/11/09 Python
在python中用url_for构造URL的方法
2019/07/25 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
Python-openCV开运算实例
2020/07/05 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
税务会计岗位职责
2014/02/18 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
2015年导购员工作总结
2015/04/25 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript