对于前端工程师来说,浏览器缓存优化是个永远的话题。前几天看了知乎上的一个问答:《大公司里怎样开发和部署前端代码?》,深以为然,所以决心使用 FIS 来优化自身的前端文件。

我们的项目使用了 go 语言的 revel 做 web 框架。这个框架的目录结构混合了前后端的文件,没法做到前后端开发的完全分离。所以我们要做的第一步,就是分离前后端的文件。

分离前后端

因为已经决定使用 FIS 来优化前端,所以特别利用了 FIS 的编译文件这个功能。既然没法做到完全的前后端分离,至少也要分离一部分吧。

首先把 app/views/ 以及 public/ 这两个文件夹移动到 revel 目录之外,假设我们的工程文件都保存在 server/ 下,我们在 server/ 的同级创建另外一个目录 web/,所以项目文件的结构大概是这样的:

	├─┬ server
│ ├── app
│ ├── ...
│ └── tests
└─┬ web
├─┬ app
| └── views
└── public

然后在 web/ 下新建一个 fis-conf.js 文件,内容如下:

	fis.config.merge({
deploy : {
local : {
to : '../server'
}
}
});

此时如果我们运行命令 fis release -md local 就会发现,web/ 下的文件都按照目录结构保存到了 server/ 下,这样,我们就可以在 web/ 下专注的写前端代码,而不用理会 server/ 下的后端代码了。如果用了 fis -w 的话更是全自动了。

资源重新定位

HTML 文件

之前由于要区分服务器环境和本地开发环境,所以在 html 中大量使用了 .RunMode 来判断部署环境,例如:

	<img src="{{if eq .RunMode "prod"}}http://cdn.example.com{{end}}/img/image.png">

现在使用 FIS 以后,这样的写法并不被支持,而且也没有必要这样写。因为 FIS 会自动在打包的时候插入 cdn 域名,开发的时候完全不需要考虑。所以首先就是要把所有这种资源定位全部修改成指向本地资源。

CSS 文件

另外一个会引用静态资源的就是 css 了。由于 css 没有条件判断之类,所以之前都是在上传的时候手动修改资源文件的引用地址,文件一多,相当痛苦。用了 FIS ,这部分工作完全可以变成全自动替换修改,妈妈再也不用担心我漏掉几个文件没改了呢。只要把所有的资源定位改成指向本地资源的即可。

JavaScript 文件

同样的,js 文件里的资源定位也需要修改。之前通过 runMode 判断的,现在通通不需要了。不过跟 html 和 css 不同的是,js 里需要特别的提示符。

之前引用资源像这样:

	var img = "/path/to/image.png";

现在要改成这样:

	var img = __uri("/path/to/image.png");

否则 FIS 同样是不识别的,也就不会自动替换了。

预编译语言的支持

项目开发的时候,我们使用了 LESS 和 CoffeeScript 这两种预编译语言来加速开发。之前都是用 sublime text 的插件在保存文件的时候自动编译到指定目录。使用 FIS 后,这部分工作也可以交给 FIS 来做。尤其像 CoffeeScript,插件不支持编译的时候保持目录结构,相当痛苦。

首先我们要安装几个编译器。

	npm install -g fis-parser-less fis-parser-coffee-script

然后在项目根目录下的 fis-conf.js 中添加代码,让它看起来像这样:

	fis.config.merge({
modules : {
parser : {
coffee : 'coffee-script',
less : ['less']
}
},
roadmap : {
ext : {
less : 'css',
coffee : 'js'
}
},
deploy : {
local : {
to : '../server'
}
}
});

这样,我们就可以专注的写 coffee-script 和 less,而不用管编译什么的了,也不必捆绑在一个编辑器上了。


至此,这次使用 FIS 来优化前端代码就告一段落了。

配置 FIS 来适配 go revel 框架以优化前端缓存策略的更多相关文章

  1. Hibernate框架(四)缓存策略+lazy

    Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率问题,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两 ...

  2. Windows7下安装golang语言开发环境和revel框架

    1.下载先去下载32位或64 golang window 安装包 并安装下载地址:https://www.golangtc.com/download 本人更改了安装地址为 D:\GO\Go 2. go ...

  3. bootstrap table--面相配置、hook、适配的表格框架

    bootstrap table--面相配置.hook.适配的表格框架

  4. Go语言实战 - revel框架教程之MongDB的最佳搭档revmgo

    由于revel框架本身对于model层的编写没有提供任何指导,所以在设计这部分的时候就有些犹豫,反复斟酌到底怎样才算是最佳实践. 我在做山坡网的时候刚开始也纠结了一下,拿不准mongodb的sessi ...

  5. Go语言Revel框架 环境搭建

    1.首先参考连个链接 http://blog.csdn.net/creak_phone/article/details/12620969 http://www.geek521.com/?p=616 2 ...

  6. revel框架教程之缓存和Job

    Go语言实战 - revel框架教程之缓存和Job   所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了 ...

  7. Go语言实战 - revel框架教程之权限控制

    一个站点上面最基本都会有三种用户角色,未登录用户.已登录用户和管理员.这一次我们就来看看在revel框架下如何进行权限控制. 因为revel是MVC结构的,每一个url其实都会映射到一个具体的Cont ...

  8. 【腾讯Bugly干货分享】QQ电话适配iOS10 Callkit框架

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/58009392302e4725036142fc Dev Club 是一个交流移动 ...

  9. revel框架教程之CSRF(跨站请求伪造)保护

    revel框架教程之CSRF(跨站请求伪造)保护 CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山 ...

随机推荐

  1. NOIP2017赛前模拟11月4日总结:

    第一次挂0·····有点感伤···主要是因为时间分配太不合理了··花2个半小时搞第一题最后还wa完了··第二题很简单花了30分钟打完但没打对拍结果wa完···第三题暴力可以拿20分的但没时间打了··· ...

  2. 汕头市队赛 SRM13 T2

    这道题很容易想到是二分 但是因为可能会爆LL 所以要加一波特判 #include<cstdio> #include<cstring> #include<algorithm ...

  3. Poj 2096 Collecting Bugs (概率DP求期望)

    C - Collecting Bugs Time Limit:10000MS     Memory Limit:64000KB     64bit IO Format:%I64d & %I64 ...

  4. [HNOI2002] 公交车路线

    题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另外一个公交站往往要换几次车,例如从公交站A到 ...

  5. YYH的营救计划(NOIP模拟赛Round 6)

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!YYH感动的热泪盈眶,开起了门…… YYH的父亲下班回家,街坊邻居说YYH被一群陌生人强行押上了警车!YYH的父 ...

  6. C语言中字符串的格式化

    本文整理转载自:http://wenku.baidu.com/view/065d62fff705cc1755270989.html C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度 ...

  7. js常用函数总结

    字符串函数 indexOf 返回字符串中一个子串第一处出现的索引(从左到右搜索).如果没有匹配项,返回 -1 . var index1 = a.indexOf("l"); //in ...

  8. 给Input type='date'赋值

    (如有错敬请指点,以下是我工作中遇到并且解决的问题) 需要使用AngularJS动态给<input type="date" />赋值. 我使用的是ng-bind=&qu ...

  9. Kubernetes控制节点安装配置

    #环境安装Centos 7 Linux release 7.3.1611网络: 互通配置主机名设置各个服务器的主机名hosts#查找kubernetes支持的docker版本Kubernetes v1 ...

  10. flask的orm框架(SQLAlchemy)-操作数据

    # 原创,转载请留言联系 Flask-SQLAlchemy 实现增加数据 用 sqlalchemy 添加数据时,一定要注意,不仅仅要连接到数据表,并且你的创建表的类也必须写进来.而且字段和约束条件要吻 ...