这里的文件负责配置swig模板引擎。

index.js

var jsonHash = require('./json_file');
var staticTag = require("./tag-static"); exports.init = function (swig) {
swig.setExtension('static', function (input) {
//swig.setExtension为自定义标签添加扩展。'static'为自定义标签的名字
//input是通过模板标签取到的值
var hashList = {},
output = input; var isJs = (/(\.js)$/).test(input);
var isCss = (/(\.(scss|css))$/).test(input); if (isJs) {
hashList = jsonHash.jsHash();
} else if (isCss) {
hashList = jsonHash.cssHash();
input = input.replace(/(\.scss)$/, '.css'); //
} else {
hashList = jsonHash.imgHash();
}
//根据文件类型获取相应的名单
if (hashList[input]) {
output = '/' + STATIC_URL + hashList[input];
} else if (NODE_ENV === 'dev' && isCss || isJs) {
output = '/' + STATIC_URL + input;
} else {
output = '/' + STATIC_URL + input;
}
//确定文件名和路径 return output;
}); swig.setTag('static', staticTag.parse, staticTag.compile, staticTag.ends, staticTag.blockLevel);
// parse自定义解析函数,compile自定义编译函数,ends是否需要结束标签,blockLevel如果是false,则它不会被编译到block外面当它继承一个父模板的时候
};

json_file.js

var jsonfile = require('jsonfile');
var csshashFile, jsHashFile, imgHashFile;
var cssCompressed, jsCompressed, imgCompressed;
var isDev = NODE_ENV === 'dev'; try {
csshashFile = jsonfile.readFileSync('./hash/css_hash.json');
//读取hash名单,如果可以读取到json文件,说明已经执行过gulp build任务,在hash文件夹下生成相应的名单文件
cssCompressed = true;
} catch (e) {
csshashFile = {};
} try {
jsHashFile = jsonfile.readFileSync('./hash/js_hash.json');
jsCompressed = true;
} catch (e) {
jsHashFile = {};
} try {
imgHashFile = jsonfile.readFileSync('./hash/img_hash.json');
imgCompressed = true;
} catch (e) {
imgHashFile = {};
} exports.cssHash = function () {
var file = isDev ? (cssCompressed ? jsonfile.readFileSync('./hash/css_hash.json') : csshashFile) : csshashFile;
var json = {}; for (var key in file) {
var l = key,
r = file[key]; json['/' + l] = '/' + STATIC_FILES_OUTPUT + '/' + r; //取出名单存入对象并返回
} return json;
}; exports.jsHash = function () {
var file = isDev ? (jsCompressed ? jsonfile.readFileSync('./hash/js_hash.json') : jsHashFile) : jsHashFile;
var json = {}; for (var key in file) {
var l = key,
r = file[key]; json['/' + l] = '/' + STATIC_FILES_OUTPUT + '/' + r;
} return json;
}; exports.imgHash = function () {
var file = isDev ? (imgCompressed ? jsonfile.readFileSync('./hash/img_hash.json') : imgHashFile) : imgHashFile;
var json = {}; for (var key in file) {
var l = key,
r = file[key]; json['/' + l] = '/' + STATIC_FILES_OUTPUT + '/' + r;
} return json;
};

tag-static.js

exports.parse = function (str, line, parser, types, options) {
var matched = false;
parser.on('*', function (token) {
if (matched) {
throw new Error('Unexpected token ' + token.match + '.');
}
matched = true;
return true;
}); return true;
}; exports.compile = function (compiler, args, content, parents, options, blockName) {
return '_output += _ext.static(' + args[0] + ');';
}; exports.ends = false;
exports.blockLevel = false;

swig模板经过这一系列的配置是什么样的效果呢?

原来在gulp任务里通过gulp-rev-all-fixed的处理后,给所有的静态文件的文件名加上了哈希值,并且如果文件有变化,哈希值文件名就就会变化。

就像这样,扩展名之前的六位就是哈希值的名字,会随文件的变动而变化。

然后我们自定义的static swig标签就是为了处理文件引用时文件名的问题,当我们写html的时候,引入的文件都用自定义标签来写。

<link rel="stylesheet" href="{% static '/css/base.scss' %}" />
<link rel="stylesheet" href="{% static '/widget/global/fonts/font-awesome/font-awesome.min.css' %}">

当swig编译html的时候看到自定义标签就会去找hash文件夹下的名单文件,名单文件里是一个对象,是源文件名对应改变后的哈希文件名,然后根据规则替换,引入的文件就不会因为名字不对而报错了。css样式里的背景图片的url也会被替换。做这样设置的原因是为了防止浏览器缓存静态文件。

express+gulp构建项目(五)swig模板的更多相关文章

  1. express+gulp构建项目(二)启动项目和主文件

    这一次整理的内容是项目主文件和如何启动项目. 启动项目 通过nodejs官网的例子https://nodejs.org/docs/latest-v4.x/doc/api/synopsis.html我们 ...

  2. express+gulp构建项目(一)项目目录结构

    express是基于nodejs平台的web框架,它可以让我们快速开发出web引用.而gulp是一种自动构建工具,非常强大,有了它,能帮我们完成很多繁琐的工作,例如,静态文件的压缩,为静态文件加上哈希 ...

  3. express+gulp构建项目(三)gulp任务

    这次来看一看gulp是怎么工作的. tasks/paths.js paths.js文件里存放的是gulp任务中需要导入的文件的路径和导出的路径. /** * gulp.src 地址 * gulp.de ...

  4. express+gulp构建项目(四)env环境变量

    这里的文件的作用是负责设置env环境变量和日志. index.js try { require('dotenv').load({silent: true}); //dotenv从一个.env文件中读取 ...

  5. 使用gulp构建项目

    gulp.js作为一个前端构建工具,类似于webpack.Grountjs.rollupjs,不过相对于其他几种打包工具,gulp的使用更轻量,配置更简单,打包速度更快,今天不说他们几个的区别,也不说 ...

  6. express - 快速构建项目

    1,cnpm i express -g 2,  cnpm i express-generater -g 3, express - e  项目名

  7. 用gulp构建你的前端项目

    前言 前端技术发展日新月异,随着模块化.组件化的提出,前端变得越来越复杂,静态资源越来越多,那么对静态资源的处理,如压缩,合并,去掉调试信息.. 如果还是人工去处理,效率非常之低且还容易出错,于是自动 ...

  8. 2016-7-15(1)使用gulp构建一个项目

    gulp是前端开发过程中自动构建项目的工具,相同作用的还有grunt.构建工具依 靠插件能够自动监测文件变化以及完成js/sass/less/html/image/css/coffee等文件的语法检查 ...

  9. gulp进阶构建项目由浅入深

    gulp进阶构建项目由浅入深 阅读目录 gulp基本安装和使用 gulp API介绍 Gulp.src(globs[,options]) gulp.dest(path[,options]) gulp. ...

随机推荐

  1. 【实践】js实现随机不重复抽取数组中元素

    经过3个星期的时间终于用做完了学校的练习作品了,但是发现在用jq 做互动虽然很方便但却带来了不少的烦恼 所以在以后的日子里我要好好学 js 了! 然后呢在博主之前学java 里面 另我最头痛的就是做产 ...

  2. YbSoftwareFactory 代码生成插件【十七】:先进的权限模型体系设计

    目前权限管理系统不少,但通用.灵活.符合现代企事业单位实际工作需要的不多.现有的权限系统绝大多数都是以模块为核心,而本权限模型将摒弃此类普遍的做法,将以组织机构为核心来进行权限系统的设计,因为这更符合 ...

  3. 用Swift语言做App开发之单元测试

    作为一个有质量保障的应用程序,当然少不了单元测试:Swift开发的App也亦如此,此文将以一个简单的实例来介绍Swift中的单元测试. 这里我们使用XCode模版自带的XCTest框架,此框架包含了一 ...

  4. switch 与 python字典

    python 中并没有switch语句,但是有一个数据类型与switch语句特别相似,它就是 dict{ key: value, ...} 下面用 dict{ key:value,..} 来简单的实现 ...

  5. MVC中view和controller相互传值的方法

    MVC项目中,在view层如果使用前台框架,框架中会有封装好的相互传值方法.但是,那些postdata[][]方法不一定能够满足功能需求,反而一些常用的传值方法可能会刚好解决它们的不足.总结如下: 一 ...

  6. 三元运算与lambda表达式

    #三元运算,就是对if else的简写 if 1 == 1: print("jasper") else: print("sb") 三元运算写法 name=&qu ...

  7. 【前端】iterable类型的 forEach方法

    看三个例子: a = [ age: 1 , age: 2 ] a.forEach (item) -> item.age = 0 # 有效 console.log a # [ # age: 0 # ...

  8. Django 步骤

    1. 初始化项目 django-admin startproject mysite2. 设置 settings 数据库配置, 必要时手动创建数据库3. 初始化数据库 python manage.py ...

  9. python之前端

    一.Html总结 1.Html简介 HTML 是一种标记语言 忽略大小写,语法宽松 使用 HTML 标记和元素,可以: 控制页面和内容的外观 发布联机文档 使用 HTML 文档中插入的链接检索联机信息 ...

  10. reactive-turtle

    reactive-turtle 标签(空格分隔): Scala Github 偶然在Github上看到一个有意思的小项目,一个粑粑教11岁的儿子学习scala,因为学习语法等太枯燥了,所以写了一个海龟 ...