前端工程编译打包优化尝试

近期对公司前端项目的文件组织结构和编译打包方式做了一些调整,记录如下。

1. 文件结构总览

1.1 开发环境说明

随着项目逐渐庞大,考虑到代码的组织维护以及项目架构的可扩展性,采用前后端分离的部署方案。前端项目作为独立的项目维护,由后台提供Restful API进行交互。

前端项目采用了AngularJS框架,Jade模板编写网页,基于Nodejs环境使用bower进行依赖管理,使用gulp编译和打包。

1.2 项目文件总体结构

app:使用gulp编译打包生成的路径;

master:jade、js、less/sass 等源文件;

server:前端动态加载内容,如左侧菜单栏;

vendor:依赖组件。

2. 存在问题

2.1 首次访问加载缓慢

当前使用的编译方案中,将所有的JS脚本concat到app.js中,所有的第三方组件concat到base.js中,CSS样式也是同样整合到一个app.css文件中输出。虽然AngularJS的特点能够在Single Page应用中完全发挥,但同时导致用户首次访问页面时,需要下载所有的js和css,在网络状况不佳或服务器性能下降时体验相当差。如果是作为后台管理的Web应用,也许尚能容忍;作为购物网站的话,访问量最高的首页加载慢,这是不能忍受的。

2.2 文件编排混乱

在以往的文件编排中,只是将网页文件、脚本文件和样式文件分别存放,其内部之间没有分级或者分类,不同模块的文件混杂在一起。这导致在发现Bug后需要定位到代码时,查找相应的代码文件变得困难。有的时候Bug代码比较新,维护人员能够清楚地定位到代码位置,但是对于比较久远的Bug,就不那么好找了。

3. 新的方案

针对上述两个问题,对前端项目结构进行调整。

3.1 网页文件

鉴于之前的项目文件结构将网页文件Jade集中放在一个文件夹中,不易于查找,导致开发和维护困难度增加,因此将jade文件分模块存放,每个模块独立文件夹。以商品模块“item”为例,在“master/jade/views”目录下的“item”文件夹中,存放该模块的网页文件,组织关系自行维护。

3.2 JS脚本

3.2.1 模块化

JS文件采用横向和纵向两种划分方式结合。

对于公共的基础模块,如loadingbar、ui-router等,不会与其他模块产生依赖,模块内部实现完整的功能,因此按照每个模块独立文件夹的形式存放。在图中红线以下部分,以ui-route组件为例,其使用的JS脚本均存放在routes文件夹内。

开发人员的JS脚本存放在custom文件夹内,顶层沿用controllers、directives、services的划分,下层进一步按照模块划分,如item模块的controller独立存放于item文件夹下。 directive和service尽量做到抽象通用,鉴于文件数量少且出错率低,暂不做进一步分类。

4. 输出目录结构

编译生成的文件与源代码master目录下的结构相同。

以前的编译过程中,将所有的JS脚本打包成一个app.js,导致首次加载缓慢,为了解决该问题,JS文件还是按照模块编译,将公用的脚本和库编译成app.js和base.js,各功能模块的JS脚本各自编译,存放在本模块的文件夹内。模块内的脚本编译成一个JS文件。如item模块,包含的3个JS脚本编译成一个item.js。

这样做出于两个原因:

1、只将必要的公用依赖编译到app.js和base.js中,减小这两个文件的体积;

2、将模块内部的脚本编译成一个JS文件,访问页面时动态加载脚本,同时保证只下载一次所需的功能脚本,减少网络延迟。

5. 示例

将文件分类编译只是完成了第一步,还需要完成在网页加载时才下载相应的脚本和样式文件。“ocLazyload”是保证按需加载的核心,组件注入后可在配置route.config.js时使用。

基本思路是将脚本和样式文件当做组件注入到网页绑定的Controller中。

以增加 item模块为例,该模块实现商品管理功能。

1 、首先创建 item.jade页面,引用itemController ;

2 、创建item.controller.js文件,定义 itemController;

3 、在lazyload.constants.js中指定 itemController对应的脚本文件;

4 、在route.config.js中,定义新的菜单注入 itemController;

5 、至此,新建模块加入到项目中。

6. 结束

此方案实测可行,首页加载公共组件和脚本,功能页面加载相应的功能脚本和样式。即使是JS和CSS脚本超大或网络环境恶劣的情况下,也不会导致网页显示混乱,页面是在依赖的资源全部下载后进行跳转的。在浏览器开启缓存时,刷新也不会重新下载脚本和样式文件。

时间: 2024-10-09 20:46:34

前端工程编译打包优化尝试的相关文章

前端工程与性能优化

每个参与过开发企业级 web 应用的前端工程师或许都曾思考过前端性能优化方面的问题.我们有雅虎 14 条性能优化原则,还有两本很经典的性能优化指导书:<高性能网站建设指南>.<高性能网站建设进阶指南>.经验丰富的工程师对于前端性能优化方法耳濡目染,基本都能一一列举出来.这些性能优化原则大概是在 7 年前提出的,对于 web 性能优化至今都有非常重要的指导意义. 然而,对于构建大型 web 应用的团队来说,要坚持贯彻这些优化原则并不是一件十分容易的事.因为优化原则中很多要求与工程管理

前端工程:javascript的优化小结

  我觉得优化javascript是一门高深的学问,在这里也只能站在前人的肩膀上,说一些我浅显的认识,更希望的是抛钻引玉,如有不对,敬请斧正. 首先,要认识到是,优化js的关键之处在于,优化它的运行速度,以此为切入点. javascript的优化原则是:二八原则 满足考量大多数情况,而遇到极端情况,有能力则兼顾之,学会放弃,适当取舍: 原因是,影响用户的体验很重要的因素之一响应时间 0.1s: 用户觉得很流畅 1.0s: 用户的操作可能偶尔受到影响,并且用户已经能感觉到有些不流畅 10s : 对

[转载]前端工程——基础篇

特别声明:本文转载@云龙的<前端工程——基础篇>,感谢@云龙的分享. 喂喂喂,那个切图的,把页面写好就发给研发工程师套模板吧. 你好,切图仔. 不知道你的团队如何定义前端开发,据我所知,时至今日仍然有很多团队会把前端开发归类为产品或者设计岗位,虽然身份之争多少有些无谓,但我对这种偏见还是心存芥蒂,酝酿了许久,决定写一个系列的文章,试着从工程的角度系统的介绍一下我对前端,尤其是Web前端的理解. 只要我们还把自己的工作看作为一项软件开发活动,那么我相信读过下面的内容你也一定会有所共鸣. 前端,是

前端工程——基础篇

# 前端工程--基础篇 > 喂喂喂,那个切图的,把页面写好就发给研发工程师套模板吧. 你好,切图仔. 不知道你的团队如何定义前端开发,据我所知,时至今日仍然有很多团队会把前端开发归类为产品或者设计岗位,虽然身份之争多少有些无谓,但我对这种偏见还是心存芥蒂,酝酿了许久,决定写一个系列的文章,试着从工程的角度系统的介绍一下我对前端,尤其是Web前端的理解. 只要我们还把自己的工作看作为一项软件开发活动,那么我相信读过下面的内容你也一定会有所共鸣. ## 前端,是一种GUI软件 现如今前端可谓包罗万象

Ant编译打包Android工程流程

一.Ant编译打包android工程步骤 二.Ant apk签名 1.keystore签名    定义自己的签名文件 生成keystore文件:keytool -genkey -alias android.keystore -keyalg RSA - validity 20000 -keystore android.keystore 对应的java命令:jarsigner -verbose -keystore android.keystore -signedjar android_signed.

前端工程与模块化框架

and others Owner fouber commented on 14 Jun 2014 本文最先发表在 DIV.IO - 高质量前端社区,欢迎大家围观 不要再求验证码了,这个blog目前有800+人订阅,求验证没什么的很影响其他订阅者,可以在div.io上申请,定期会有同学发放的... 一直酝酿着写一篇关于模块化框架的文章,因为模块化框架是前端工程中的 最为核心的部分 .本来又想长篇大论的写一篇完整且严肃的paper,但看了 @糖饼 在 DIV.IO 的一篇文章 <再谈 SeaJS 与

前端工程之模块化

模块化是一种处理复杂系统分解成为更好的可管理模块的方式,它可以把系统代码划分为一系列职责单一,高度解耦且可替换的模块,系统中某一部分的变化将如何影响其它部分就会变得显而易见,系统的可维护性更加简单易得. 前端开发领域(JavaScript.CSS.Template)并没有为开发者们提供以一种简洁.有条理地的方式来管理模块的方法.CommonJS(致力于设计.规划并标准化 JavaScript API)的诞生开启了“ JavaScript 模块化的时代”.CommonJS 的模块提案为在服务器端的

前端工程精粹(一):静态资源版本更新与缓存

本文从一个全新的视角来思考web性能优化与前端工程之间的关系,通过解读百度前端集成解决方案小组(F.I.S)在打造高性能前端架构并统一百度40多条前端产品线的过程中所经历的技术尝试,揭示前端性能优化在前端架构及开发工具设计层面的实现思路. 性能优化原则及分类 笔者先假设本文的读者是有前端开发经验的工程师,并对企业级web应用开发及性能优化有一定的思考,因此我不会重复介绍雅虎14条性能优化原则.如果您没有这些前续知识,请移步这里来学习. 首先,我们把雅虎14条优化原则,<高性能网站建设指南>以及

Webpack编译速度优化实战

当你的应用的规模还很小时,你可能不会在乎Webpack的编译速度,无论使用3.X还是4.X版本,它都足够快,或者说至少没让你等得不耐烦.但随着业务的增多,嗖嗖嗖一下项目就有上百个组件了,也是件很简单的事情.这时候当你再独立编前端模块的生产包时,或者CI工具中编整个项目的包时,如果Webpackp配置没经过优化,那编译速度都会慢得一塌糊涂.编译耗时10多秒钟的和编译耗时一两分钟的体验是迥然不同的.出于开发时的心情的考虑,加上不能让我们前端的代码编译拖累整个CI的速度这两个出发点,迫使我们必须去加快