前端腳本構建方案

此次主要是說明如何爲新模塊配置,以實現打包壓縮。css

文件目錄

  1. gulp目錄存放構建配置文件。
  2. build目錄存放構建好的css和js文件。
  3. 根目錄下有gulpfile.js和package.json文件
  4. js目錄存放源代碼文件 

安裝

在本地安裝Node,而後安裝gulphtml

npm install gulp -g

 

在項目根目錄下執行前端

npm install

 

安裝全部的構建過程依賴的包,安裝好之後,配置模塊的構建文件。jquery

配置

 

模塊配置文件格式以下:web

module.exports = {
css: [
'css/main.css',
'css/selector.css',
'css/search-v1.css',
],
js: ['js/search-main.js']
}

css屬性是須要打包的css文件路徑,構建結束後會打包成一個css文件。
js屬性是js的入口文件,目前採用cmd模式作模板化,只需配置好入口文件,打包過程會對js的引用關係進行分析,將全部引用的js合併打包。npm

js入口文件:json

seajs.config({
// 基礎路徑
// base: window.seajsBase,
// 路徑配置
paths: {
'js': '../js',
'css': '../css',
'dist' : './dist'
},
// 別名配置
alias: {
'jquery': 'js/jquery',
'index': 'js/index',
'citys-pc':'js/citys-pc',
'citys':'js/citys',
'industry':'js/industry-old',
'jobs':'js/jobs-old',
'bigcity':'js/bigcitys',
'js/selector':'js/selector-v1'
},
// 文件編碼
charset: 'utf-8'
})
//加入模塊引用代碼
seajs.use("./js/search-v1")

入口文件中包含了sea-config.js中的配置內容,針對每一個模塊,能夠定義本身的個性配置。gulp

注意加入模塊的引用:後端

seajs.use("./js/search-v1")

針對每一個模塊,模塊負責人只須要維護本身的配置文件,若是發現本身的模塊和其餘模塊的有衝突,最好單首創建本身的模塊,作好註釋。瀏覽器

構建


配置完成後,在根目錄下,執行

gulp

打包完成後,查看build目錄,會生成對應的css和js文件

gulp命令默認會對全部模塊所有構建,若是隻想構建本身的模塊能夠執行

gulp [配置文件名]

 

例如:

gulp search

 

注意

構建系統會爲每一個模塊單首創建一個任務,以該配置文件的名稱做爲任務名。

調試


gulp任務啓動後,會對css和js進行構建,同時啓動本地測試web服務器,以及css和js文件的監聽,若是有css或者js更新,瀏覽器會自動刷新,幫助開發進行調試。

若是想加斷點調試的話,在頁面中引用原有的入口文件便可。

上線

 

須要上線的文件是build的下css和js文件,也包括圖片,更新後端模板文件的引用,加版本號。

注意

  1. 模板裏的必定要加版本號,css和js都要加。
  2. 打包完成之後,sea-config.js文件前端就不須要引用了,只需引用打完包的js便可。若是頁面裏還有其餘模塊沒有打包,sea-config.js文件還須要部署,而且加版本號。
  3. 在本地須要對打包後的js和css進行測試,防止打包後出現未知的問題。

實現

整個流程由gulp實現,每一個模塊只需增長一個配置文件,便可實現壓縮打包,在線調試等,核心的gulp代碼以下:

var gulp = require('gulp'),
  path = require('path'),
  gls = require('gulp-live-server'),
  cmd = require('gulp-cmd'),
  minifycss = require('gulp-clean-css'),
  concat = require('gulp-concat'),
  uglify = require('gulp-uglify'),
  rename = require('gulp-rename'),
  hash = require('gulp-hash'),
  del = require('del'),
  fs = require('fs');
//讀取文件夾內的文件列表
var files = fs.readdirSync('./gulp');
//以文件名做爲屬性組裝配置文件
var config = {};
files.forEach(function (file) {
  config[path.parse(file).name] = require('./gulp/' + file);
})
var tasks = [];
//遍歷配置文件,建立構建任務
for (var item in config) {
  (function (item) {
    var subTasks = [];
    if (config[item]['css']) {
      gulp.task(item + '_css', function () {
        return gulp.src(config[item]['css'])
          .pipe(minifycss({ compatibility: 'ie7' }))
          .pipe(concat(item + '-main.css'))
          .pipe(gulp.dest('build/css/'));
      });
      subTasks.push(item + '_css');
      tasks.push(item + '_css');
    }
    if (config[item]['js']) {
      gulp.task(item + '_js', function () {
        gulp.src('js/jquery.js')
          .pipe(cmd())
          .pipe(gulp.dest('build/js'));
        return gulp.src(config[item]['js'])
         .pipe(concat(item + '-main.js'))
          .pipe(cmd({
            ignore: ['jquery']
          }))
          .pipe(uglify())    //壓縮
          .pipe(gulp.dest('build/js'));  //輸出
      });
      subTasks.push(item + '_js');
      tasks.push(item + '_js');
    }
    if (subTasks.length > 0) {
      gulp.task(item, ['clean'], function () {
        gulp.start(subTasks, 'serve');
      });
    }
  })(item);
}
//監聽服務
gulp.task('serve', function () {
  //啓動80端口做爲本地web服務器
  var server = gls.static('./', 80);
  server.start();
  //監聽文件目錄
  gulp.watch([
    path.resolve(__dirname, './css/*.css'),
    path.resolve(__dirname, './js/*.js'),
    path.resolve(__dirname, './*.html')
  ],
    function (file) {
      gulp.start(tasks, function () {
        server.notify.apply(server, [file]);
      })
    });
});
//清理目標構建文件
gulp.task('clean', function (cb) {
  del(['build/css/*', 'build/js/*']).then(paths => {
    cb();
    console.log('Deleted files and folders:\n', paths.join('\n'));
  });
});
//默認的任務,執行所有的構建任務
gulp.task('default', ['clean'], function () {
  gulp.start(tasks, 'serve');
});

版本控制

目前上線仍是須要手動修改模板文件的引用的資源版本號,有幾個方案能夠考慮:

一、在後端的配置文件中加入一個版本號配置項,前端讀取配置項做爲版本號,在Jekins增長一個修改版本號流程,Java端讀取配置文件注意緩存的問題,保證配置文件更新後,能及時更新配置,或者每次讀取文件時記錄讀取時間,超過必定的時間從新讀取配置文件,能夠保證不重啓服務器的狀況下更新版本號。

二、在後端系統啓動的時候,生成一個時間戳做爲版本號,每次上線重啓系統,便可更新js版本號。

第一個方案相對比較好,能夠在不重啓服務器的狀況下,更新版本號,考慮採納。

注意

在部署的時候 先上靜態資源,後重啓Java Web服務器,否則服務器重啓後,仍是讀取舊的靜態資源,緩存了舊的靜態資源,新上的靜態資源仍是不能更新。

 

總結

對css和js打包壓縮之後,頁面引用的css和js文件變少了,大幅減小了http請求數,也就相應減小了出錯的機率,不過因爲目前前端和後端部署未分離,靜態資源的版本號還須要手工更新,後期上線會在服務器端執行構建流程,包括版本號的修改也會自動化。

另外,在qa測試上線過程當中,能夠檢測css和js是否按要求加入版本號,目前版本號的規則是當前的日期,好比:"./a.js?v=20160809",若是沒有加版本號,提醒前端工程師,也能夠在Jekins中對當前部署的模板進行檢測,若是版本號不知足條件,禁止上線,或者寫腳本自動修改。

相關文章
相關標籤/搜索