背景

初出社会,刚实习两个月,在公司做Java开发的时候偶尔使用AngularJS框架写一些页面。觉得用起来特别爽。
言归正传,为了完成毕设,被迫在工作之余,研究了AngularJS路由的使用,进而了解了SPA应用在用户体验上所占据的优势。于是从毕设项目中提取出了自己搭建SPA的过程,做了一个小的Demo,在此做记录。

准备工作

在这个Demo中我使用npm管理框架的依赖包,需要准备的框架分别如下:

npm命令
AngularJS npm install angular
Angular Route npm install angular-route
为了让页面看起来爽,还加了妹子UI的框架包 ↓↓↓↓
Amaze UI npm install amazeui
jQuery npm install jquery

所以整个项目的目录结构如下:

注:view放置的是为主页面引用的模板html代码,js放置的是各模板的Controller和整个应用的配置文件

编写主页面

因为是SPA,所以理论上页面只能有一个,其他的都为主页面所引用。在主页中要做的工作就是把应用的整体结构搭建出来,以及引用一些框架资源和Controller。

页面内容分成了头、内容、脚,其中内容部分通过路由引用其他html代码
main.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用AngularJS构建SPA</title><link rel="stylesheet" href="../node_modules/amazeui/dist/css/amazeui.min.css"/>
</head>
<body ng-app="spaApp"><!--header start 引入页头文件--><section id="header" ng-include="'header.html'"></section><!--header end--><!--content start 使用ng-view显示路由控制的html模板 --><section id="content" class="am-container"><ng-view></ng-view></section><!--content end--><!--footer start 引入页脚文件--><section id="footer" ng-include="'footer.html'"></section><!--footer end--><!-- js framework file --><script src="../node_modules/jquery/dist/jquery.min.js"></script><script src="../node_modules/amazeui/dist/js/amazeui.min.js"></script><script src="../node_modules/angular/angular.js"></script><script src="../node_modules/angular-route/angular-route.js"></script><!-- js config file 各配置文件 --><script src="js/config/app_config.js"></script><script src="js/config/route_config.js"></script><!-- js controller file 各html模板控制器 --><script src="js/controller/headerCtrl.js"></script><script src="js/controller/footerCtrl.js"></script><script src="js/controller/pageOneCtrl.js"></script><script src="js/controller/pageTwoCtrl.js"></script></body>
</html>

编写页头页脚

页头文件和页脚文件因为是这个应用的基本显示部分,每个页面都具有相同的页头页脚,所以不需要路由控制,独立出header.html和footer.html及他们对应的控制器(当然,如果不需要现实全局变量,不需要控制器也行),代码如下。
header.html

<div ng-controller="headerCtrl"><header class="am-topbar"><h1 class="am-topbar-brand"><a href="#toOne">{{APP_NAME}}</a></h1><button class="am-topbar-btn am-topbar-toggle am-btn am-btn-sm am-btn-success am-show-sm-only" data-am-collapse="{target: '#doc-topbar-collapse'}"><span class="am-sr-only">导航切换</span> <span class="am-icon-bars"></span></button><div class="am-collapse am-topbar-collapse" id="doc-topbar-collapse"><ul class="am-nav am-nav-pills am-topbar-nav"><li><a href="#toOne">One</a></li><li><a href="#toTwo">Two</a></li></ul></div></header>
</div>

footer.html

<div ng-controller="footerCtrl"><footer data-am-widget="footer"class="am-footer am-footer-default am-topbar-fixed-bottom"data-am-footer="{  }"><div class="am-footer-switch"><span>{{APP_NAME}}</span><span class="am-footer-divider"> | </span><span>好好学习,天天向上</span></div><div class="am-footer-miscs "><p>由 <a href class="">{{DEVELOPER_NAME}}</a>提供技术支持</p><p>2018 </p></div></footer>
</div>

编写应用主体部分的内容

这里我简单使用了两个页面pageOne.html、pageTwo.html来模拟单页面应用的两个独立页面。页面代码以及对于Controller如下:
pageOne.html

<div><h1>I am page One</h1><h2>Here is my data: {{data}}</h2>
</div>

pageOneCtrl.js

spaApp.controller('pageOneCtrl',['$scope', '$rootScope', function($scope, $rootScope){$scope.data = "Welcome to page one !";
}]);

pageTwo.html

<div><span class="am-text-xxxl">I am page Two</span><hr><span class="am-text-lg">Here is my data: {{data}}</span>
</div>

pageTwoCtrl.js

spaApp.controller('pageTwoCtrl',['$scope', '$rootScope', function($scope, $rootScope){$scope.data = 'Get out from page two !';
}]);

按照期望,点击header中的One应该在页面上显示“Welcome to page one !”,而点击Two应该在页面上显示“Get out from page two !”。所以接下来要写的就是将模板代码引用到主页面上的配置。

编写整体配置文件

1. 全局配置

包含了对module的定义、全局变量的设置
app_config.js

/** 全局配置文件* 1. 定义module* 2. 配置全局变量*/
var spaApp = angular.module('spaApp', ['ngRoute']);spaApp.run(['$rootScope', function($rootScope){//通过rootScope把全局使用的东西配置好,比如应用名$rootScope.APP_NAME = 'SPA搭建总结';$rootScope.DEVELOPER_NAME = '谢仲东';
}]);

2.路由配置

主要配置路由中各个锚点指向的html文件和对应的Controller
route_config.js

/** 路由配置文件* 1.配置路由地址和对应的View&Controller*/
spaApp.config(function ($routeProvider, $locationProvider) {//防止路由地址出现感叹号和乱码$locationProvider.hashPrefix('');//当锚点为toOne时,ng-view加载pageOne.html和pageOneCtrl//当锚点为toTwo时,ng-view加载pageTwo.html和pageTwoCtrl//其余情况重定向到toOne$routeProvider.when('/toOne',{templateUrl: 'view/pageOne.html',controller: 'pageOneCtrl'}).when('/toTwo',{templateUrl: 'view/pageTwo.html',controller: 'pageTwoCtrl'}).otherwise({redirectTo: '/toOne'})
});

日后开发流程

经过路由的辅助,再也不用使用js往iframe里面装东西了。岂不爽哉?搭建完这个应用的整体结构后,接下来的开发就可以分为这几步:

  • 写新页面,例如pageThree.html。
  • 写控制这个页面的Controller,例如pageThreeCtrl.js。
  • 在主页面main.html中引用新的Controller
<script src="js/controller/pageThreeCtrl.js"></script>
  • 去route_config.js 加一个锚点指向设置
.when('/toThree',{templateUrl: 'view/pageThree.html',controller: 'pageThreetrl'})
  • 最后在任意页面的任意位置使用<a>标签来在应用内改变主体内容。
<a href="#/toThree">Three</a>
  • 愉快地开发吧!

效果图

搭建过程遇到的问题

  1. 跨域问题:因为AngularJS路由使用了Ajax异步请求,然后将模板注入到主页中。所以会出现跨域问题。所以我把Demo放在了一个SpringBoot项目中,在tomcat上访问就不会出现跨域报错问题。当然也可以放到Apache httpd上,或者在浏览器上做手脚。
  2. ng-include指令不生效:原因是ng-include指令的值没有加单引号,正确的使用方法应该是<div ng-include="'xxx.html'"></div>,粗心。
  3. 有一个缺点就是一个module里只能使用一个路由,所以如果你主页上有多个地方要实现路由就要创建多个module,分别进行配置。

项目地址

传送门:使用AngularJS搭建SPA的Demo

如何搭建SPA-单页面应用相关推荐

  1. 通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design

    通过Blazor使用C#开发SPA单页面应用程序(1) 通过Blazor使用C#开发SPA单页面应用程序(2) 通过Blazor使用C#开发SPA单页面应用程序(3) 前面学习了Blazor的特点.环 ...

  2. Java快速开发平台,JEECG 3.7.5 Vue SPA单页面应用版本发布

    JEECG 3.7.5 Vue SPA单页面应用版本发布 导读            ⊙ Vue+ElementUI SPA单页面应用 ⊙Datagrid标签快速切换BootstrapTable列表风 ...

  3. [vue] SPA单页面的实现方式有哪些?

    [vue] SPA单页面的实现方式有哪些? 1.监听地址栏中hash变化驱动界面变化2.用pushsate记录浏览器的历史,驱动界面发送变化3.直接在界面用普通事件驱动界面变化它们都是遵循同一种原则: ...

  4. [vue] 说说你对SPA单页面的理解,它的优缺点分别是什么?

    [vue] 说说你对SPA单页面的理解,它的优缺点分别是什么? 介绍:SPA应用就是一个web应用,可理解为:是一种只需要将单个页面加载到服务器之中的web应用程序.当浏览器向服务器发出第一个请求时, ...

  5. SPA单页面应用首屏加载速度提升方法

    SPA单页面应用首屏加载速度提升方法 首屏加载 计算首屏加载时间公式 解决方法 减少入口文件体积 静态资源本地缓存 UI框架按需加载 避免组件重复打包 图片资源压缩 开启GZip压缩 首屏加载 首屏加 ...

  6. (25):SPA单页面的理解

    对SPA单页面的理解,它的优缺点分别是什么,如何实现SPA应用 一.什么是SPA 1.SPA(single-page application),翻译过来就是单页应用 2.SPA是一种网络应用程序或网站 ...

  7. spa单页面应用html缓存问题

    一.背景 浏览器的http请求都有一个缓存机制,简单点说就是同路径同名文件会默认被缓存下来,提升下次访问时的速度,默认只有刷新页面或长时间未访问时才会刷新缓存. 而spa单页面应用是通过路由切换来访问 ...

  8. 根据vue的脚手架 简单的搭建一个单页面

    根据vue的脚手架 简单的搭建一个单页面 1.首先需要安装npm node.js 自带,所以去安装node.js 就可以了. node中文网址 这里是网址 或者自行百度,网上很好找.另外还需要手动安装 ...

  9. 当spa单页面应用遇上SEO,蛋痛的经历

    spa单页面应用优点当然毋庸置疑:效果酷炫,我在视觉和产品面前无从反驳:性能高速度快,全JS嘛当然快,我在运维和产品面前无言以对:运算分散,异步加载,又省硬件又省流量,我在开发和产品面前彻底投降:JS ...

  10. SPA单页面应用和SSR服务端渲染的区别

    目录 一.概念 1.1.什么是单页面应用(SPA)?  概念:整个web项目只有一个页面,使用路由机制进行组件之间的切换: 优点:客户端渲染.数据传输量小.减少服务器端压力.交互/响应速度快.前后端完 ...

最新文章

  1. Windows Server 2003显示中文为乱码(方框)的问题
  2. 灾备知识总结:容灾与备份区别、灾备技术、容灾体系规划
  3. GinWin命令控制台执行指令
  4. 基于session认证
  5. SpringCloud学习笔记:SpringCloud简介(1)
  6. mysql有子查询么_sql-带有子查询的mysql更新查询
  7. asf linux教程,ASF V3.0 windows/linux含树莓派部署流程
  8. 几行Python代码生成饭店营业额模拟数据并保存为CSV文件
  9. 弱鸡儿长乐爆零旅Day4
  10. 数据库学习笔记3-隔离级别 Read Uncommitted
  11. 计算机学院 统计学博士点,统计学 国家重点学科/博士点/硕士点
  12. Maple中solve和dsolve的区别:solve方程解,dsolve常微分方程解
  13. 【element】elementUI-中折叠面板箭头图标位置调整往左边
  14. 计算机学院校运会解说词,大学学院运动会入场解说词
  15. C# 添加Word页眉、页脚和页码
  16. PS:高清晰度的源文件保存成图片如何使图片大小最小
  17. 原来手机图片转文字这么简单!按下这个按钮,纸质稿轻松电子化
  18. 按键精灵 html转txt文件,按键精灵怎么把变量输出写入TXT文本
  19. NBIOT模组M5310接入OneNET平台
  20. 中小企业如何化解经济危机

热门文章

  1. Linux 系统管理员
  2. ssh突然无法登录Connection closed by xxx port 22
  3. html 剩余时间 自动减,HTML+CSS+JS实现今天的日期和今天剩余的时间
  4. Shell监控jvm发短信
  5. linux机械硬盘提速,4个机械硬盘优化设置技巧 让你的硬盘速度飞起来
  6. 京东jos 获取授权及php-sdk的使用示例
  7. hadoop基础----hadoop实战(七)-----hadoop管理工具---使用Cloudera Manager安装Hadoop---Cloudera Manager和CDH5.8离线安装
  8. 转一位计算机牛人的心得,谈计算机和数学,很实用~
  9. EasyGBS对接宇视SDK,多次点击录像回放出现崩溃是什么原因?
  10. An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling