前言
这个主要是讲第一版的时候,用grunt来进行官网构建。
具体构建分析
具体的构建流程是:Gruntfile.js (我知道你们根本不会看,但是我还是要贴代码 ʅ(´◔౪◔)ʃ)
1 | var _ = module.require('underscore'); |
假设以打正式地址为例: grunt r 执行的流程如下:
即执行 ‘build’, ‘i18n’, ‘release’, ‘gzip’, ‘compress:zip_release’
同时 build 又分为 ‘prepare’, ‘min’, ‘movehtml’
全部切换成单个执行任务就是:
step 1. prepare
1 | prepare => ['clean:prepare', 'less:update', 'copy:prepare', 'autoprefixer'] |
即构建前的准备工作。即
- clean:prepare 清除前次打包的一些文件
- less:update 编译生成新的css文件
- copy:prepare 打包的时候,先把workDir, 即workspace 里面的文件,复制到build的version目录,接下来就直接操作build的version目录即可,不用管workspace目录
step 2. min
1 | min => ['jst', 'useminPrepare', 'concat', 'uglify', 'jst_concat', 'cssmin', 'usemin', isRelease ? 'processhtml:release' : 'processhtml:dist', 'clean:dist'] |
即 压缩 js css 并更新相应的 html 文件, 即
- jst => html模板编译,将 <%=dist %>/tpl/ 目录里面的html模板编译成jst后缀的文件,并放在 <%=dist %>/tpl2/
- useminPrepare => 进行usemin的准备操作, 生成一份 usemin 的grunt配置文件(即合并文件,压缩js,压缩css)(usemin 分为两个步骤,第一要先进行预构建, 即 useminPrepare , 生成 contat 和 uglify 配置, 以便第三步,第四步, 第六步操作 )
- concat => 文件合并,针对第二步的grunt配置
- uglify => js 文件压缩,针对第二步的grunt配置
- jst_concat => JST模版联合, 即遍历所有的js文件,如果里面有用到模板的地方,那么就将该模板的调用代码,并入到js文件头部。
以premium.min.js 为例。这个js用到了pay/confirm-dialog-content.html 这个模板,那么就把这个模板的编译js模板放到这个文件的头部。
(这样做的好处就是,请求模板的时候,不会再去进行一次http请求去请求模板,因为js文件本身已经自带了这个模板了,减少了网络请求)
然后在调用模板的时候,判断如果是publish方式的话,就直接 执行1
window["ajst"][name + '.html'](obj)
来获取模板,调用模板的代码如下:
1 | window.util.getTemplate = function (name, obj) { |
- cssmin => css 文件压缩,针对第二步的grunt配置
- usemin => 进行 usemin 操作,并且对html文件进行路径调整
- processhtml:release => 扩大usemin 功能,增加 remove include 等功能
- clean:dist => usemin 之后,删除之前旧的js和css,只保留打包压缩后的js和css
step 3. movehtml
1 | movehtml=> ['copy:movehtml', 'string-replace:movehtmlSrcUrl', 'string-replace:movehtmlTplBaseUrl', 'clean:movehtml'] |
主要功能就是 把 html 文件从 html 文件夹移动出来, 之前的html文件都是在workspace/html 这个目录里面的,现在要移到打包的根目录下。
- copy:movehtml => 将 dist 目录下的 html 向上提取二级目录
- string-replace:movehtmlSrcUrl => 给提出来的html文件,加上版本号,并设置绝对地址(包括html文件里面的图片,url,等等都要)
- string-replace:movehtmlTplBaseUrl => 修改打包后的模板地址,和语言包的路径
- clean:movehtml => 最后去掉,版本目录里面的html目录(因为之前已经提到上两级目录去了)
step 4. i18n
1 | i18n=> ['staticfy', 'htmlmin', 'copy:i18n', 'string-replace:i18n'] |
主要功能就是进行多语言的静态文件编译
- staticfy => 多语言预编译处理,即用phantom.js来加载不同语言下的所有页面,然后保存起来
- htmlmin => html 压缩(连同模板) 等操作
- copy:i18n => 预编译完之后,要把en的文件复制到上一层, 即默认没有加语音路径参数的,就是英文
- string-replace:i18n => 预编译之后,把debug模式去掉, 即 Airdroid_isDebug 改为 false
step 5. release
1 | release=>['string-replace:releaseStaticUrl', 'string-replace:releaseServerUrl'] |
主要就是打release包的时候,将静态资源修改成绝对地址,并修改成服务端的正式接口地址
- string-replace:releaseStaticUrl => 为资源添加完整的 静态地址,包括图片
- string-replace:releaseServerUrl => 更新服务端接口地址和版本号
step 6. gzip (官网不放s3上,这一步可以不做)
1 | gzip=>['copy:gzip', 'compress:main'] |
将资源进行 gzip 压缩,主要是js和css
- copy:gzip => 所有资源复制到 gzip 目录
- compress:main => 对所有的js和css进行gzip压缩
step 7.compress:zip_release
将打的zip改名字
package.json 文件
以上就是所有的详细步骤,其实还有没有说的一点就是,上面没有指定要构建哪些html文件,其实不是所有的html文件都要构建的,其实是要在setting文件指定的。
package.json:
1 | { |
系列文章
官网构建优化流程(1) - 简介
官网构建优化流程(2) - 旧版grunt打包构建流程
官网构建优化流程(3) - grunt静态页面预编译插件 grunt-staticfy
官网构建优化流程(4) - gulp 静态页面预编译插件 gulp-staticfy
官网构建优化流程(5) - gulp jst模板联合组件 gulp-concat-js
官网构建优化流程(6) - 把原先的grunt换成gulp构建
官网构建优化流程(7) - 官网的多语言跳转规则
官网构建优化流程(8) - gulp打包构建在ie8会报错
官网构建优化流程(9) - windows 下打zip包到服务器没有执行权限的问题
官网构建优化流程(10) - gulp-staticfy进行多语言预编译的时候,会随机出现乱码
官网构建优化流程(11) - 部署转为用Jenkins自动化部署
官网构建优化流程(12) - 优化加载速度,资源分开存放
官网构建优化流程(13) - 字体文件的跨域问题 和 S3/CloudFront/COS 设置跨域CORS