javaweb男的gulp入手實(shí)踐.gulp也能應(yīng)用在jsp場(chǎng)景

前言

前端圈里,現(xiàn)在工程化的前端已經(jīng)是主流.各種前端工程化的技術(shù)比比皆是.webpack.grunt ,gulp等等等,應(yīng)接不暇.

而再回看jsp當(dāng)前的環(huán)境.當(dāng)真的落后了前端圈太多.整體的開(kāi)發(fā)模式,還是很多年前傳統(tǒng)的企業(yè)級(jí)web開(kāi)發(fā)模式.大把的jsp標(biāo)簽.struts標(biāo)簽去實(shí)現(xiàn)頁(yè)面.也無(wú)怪乎只能做傳統(tǒng)企業(yè)后臺(tái)網(wǎng)址.

我之前工作的杭州某公司就是如此,用jsp標(biāo)簽包裝了extjs的組件. 所有的html代碼都寫在java代碼里.通過(guò)xml配置來(lái)構(gòu)造頁(yè)面.確實(shí)很大的提升了開(kāi)發(fā)效率(所有的開(kāi)發(fā)都在配xml和寫一些基本的邏輯).但是蛋疼的就是,寫完頁(yè)面后,整體風(fēng)格丑陋.客戶總是會(huì)讓你修改頁(yè)面.這個(gè)時(shí)候你固化的組件反而會(huì)成為你的硬傷,可能修改頁(yè)面一點(diǎn)點(diǎn)布局和風(fēng)格.就要大把的改java代碼.

后面擺脫了這樣的公司,我開(kāi)始嘗試更主流的一下web開(kāi)發(fā)方式.放棄丑陋的ext,經(jīng)歷了純jquery時(shí)代,逐漸過(guò)渡到當(dāng)前的angular/vue 的MVVM前端框架.更快的開(kāi)發(fā)效率.和更大氣美觀的頁(yè)面風(fēng)格.已經(jīng)成為我們這邊開(kāi)發(fā)的主要技術(shù)體系.后臺(tái)java實(shí)現(xiàn).弱化了后臺(tái)業(yè)務(wù).主要的交互頁(yè)面都放在了angular的控制層和service層來(lái)實(shí)現(xiàn).

Paste_Image.png

當(dāng)技術(shù)體系逐漸完善后,效率問(wèn)題也隨之而來(lái).之前的傳統(tǒng)企業(yè)網(wǎng)站是沒(méi)有考慮過(guò)js,css壓縮,合并等等.現(xiàn)在考慮的時(shí)候,選擇一個(gè)工程化的前端工具就至關(guān)重要. 調(diào)研過(guò)webpack和百度的fis等技術(shù)后.我最終選擇了gulp.首先因?yàn)間ulp的流式編寫方式特別清晰.其次,我們的開(kāi)發(fā)工具全都是IntelliJ IDEA ,作為世界上最好用的java開(kāi)發(fā)idea.居然在界面上友好的支持gulp的任務(wù)執(zhí)行.支持界面的gulp task調(diào)試剛發(fā)現(xiàn)的時(shí)候我激動(dòng)哭了好嗎?

Paste_Image.png

Paste_Image.png

一.gulp入門

gulp是前端開(kāi)發(fā)過(guò)程中對(duì)代碼進(jìn)行構(gòu)建的工具留特,是自動(dòng)化項(xiàng)目的構(gòu)建利器;她不僅能對(duì)網(wǎng)站資源進(jìn)行優(yōu)化碎节,而且在開(kāi)發(fā)過(guò)程中很多重復(fù)的任務(wù)能夠使用正確的工具自動(dòng)完成蟹瘾;使用她,我們不僅可以很愉快的編寫代碼腹尖,而且大大提高我們的工作效率柳恐。

安裝和使用gulp.需要安裝node環(huán)境.并且使用node的npm管理工具. 如果沒(méi)有接觸過(guò)前端知識(shí).看見(jiàn)node和npm確實(shí)挺懵逼的. 其實(shí)不然,對(duì)于一個(gè)java老鳥(niǎo)來(lái)說(shuō).npm你就簡(jiǎn)單的理解成maven即可.其實(shí)是前端圈里形成的一個(gè)類maven的倉(cāng)庫(kù),npm提供各種node插件的下載.命令也很簡(jiǎn)單. npm init 就類似于mvn:eclipse 項(xiàng)目下會(huì)生成package.json文件,類似于pom.xml
請(qǐng)自學(xué)教程.
再自行安裝gulp.傳送門如下.
gulp詳細(xì)入門.node,npm和gulp安裝.
需要注意的是.npm安裝插件分為全局安裝和局部安裝.全局安裝指安裝好的組件會(huì)全部工程通用.而局部安裝只對(duì)當(dāng)前工程使用. 而gulp不但需要全局安裝,同時(shí)需要對(duì)當(dāng)前項(xiàng)目局部安裝.否則無(wú)法正常使用.
在根目錄添加一個(gè)gulpfile.js 即gulp的任務(wù)腳本文件.
在命令行輸入 gulp 任務(wù)名 即可執(zhí)行腳本里對(duì)應(yīng)任務(wù)名的任務(wù).
<pre>

以下是任務(wù)代碼范例

var gulp = require('gulp')
var concat = require('gulp-concat');//合并組件

var uglify=require('gulp-uglify');//壓縮組件

var clean = require('gulp-clean');//清空文件夾組件

var replace = require('gulp-replace');

var cheerio = require('gulp-cheerio');//dom操作組件

gulp.task('testConcat', function () {

gulp.src('dist/js')
    .pipe(clean());
gulp.src('js/*.js')
    .pipe(concat('all.min.js'))//合并后的文件名
.pipe(gulp.dest('dist/js'));

});

</pre>

二,日常應(yīng)用場(chǎng)景和gulp插件

從上面的代碼范例可以看到.gulp的任務(wù)在一開(kāi)始需要引入各式各樣的插件.其實(shí)gulp本身只是提供了一種對(duì)文件處理的平臺(tái).
讀入一個(gè)或者一批文件.調(diào)用不同的插件串式的對(duì)文件進(jìn)行一步步的處理.最終輸出到taregt目錄.
整體跟java的流處理沒(méi)什么大的區(qū)別.輸入文件.最后寫入等等.
<pre>
gulp.src('js/*.js') //讀取統(tǒng)配命令命中的所有文件
.pipe(concat('all.min.js'))//地阿偶concat插件對(duì)輸入流合并處理,方法的參數(shù)是合并后的新文件名
.pipe(gulp.dest('dist/js'));//把流輸出到dist/js目錄下
</pre>

日常最項(xiàng)目上其實(shí)用的場(chǎng)景大概是這樣的:
使用angular進(jìn)行開(kāi)發(fā),angular的service.js,controller.js,filter.js各是一個(gè)文件.文件都未曾壓縮.源文件jsp上有三個(gè)<script>引入文件.
而開(kāi)發(fā)結(jié)束后.基于網(wǎng)頁(yè)優(yōu)化要做的就是:

  1. 為了減少http請(qǐng)求,把三個(gè)js合并成一個(gè)js,
  2. 為了減少js請(qǐng)求的加載時(shí)間,把合并后的js壓縮成一個(gè)min.js
  3. 原來(lái)的三個(gè)js已經(jīng)變成了一個(gè)js.需要把輸出的jsp文件里的三個(gè)<script>去掉.換成引用新的min.js

所使用到的插件分別是

  • gulp-concat 文件合并插件
  • gulp-uglify 文件壓縮插件
  • gulp-cheerio dom操作修改dom插件
    <pre>
    源文件:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <!DOCTYPE html>
    <html>
    <head>
    <title>Hello, World</title>
    <jsp:include page="/WEB-INF/jsp/include/jquery.jsp"></jsp:include>
    <script src="js/angular.js"> </script>
    <script src="js/service.js"> </script>
    <script src="js/controller.js"> </script>
    <script src="js/filter.js"> </script>
    </head>
    <body>
    <%=aa%>
    </html>
    </pre>

<pre>
期望結(jié)果:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello, World</title>
<jsp:include page="/WEB-INF/jsp/include/jquery.jsp"></jsp:include>
<script src="js/all.min.js"></script></body>
</head>
<body>
<%=aa%>
</html>
</pre>

對(duì)此,我們修改gulpfile.js.寫上自己的合并壓縮替換任務(wù)代碼
<pre>

var gulp = require('gulp');

var concat = require('gulp-concat');//合并組件

var uglify=require('gulp-uglify');//壓縮組件

var cheerio = require('gulp-cheerio');//dom操作組件

gulp.task('testConcat', function () { // testConcat就是任務(wù)名 在命令行執(zhí)行g(shù)ulp testConcat即可執(zhí)行此任務(wù)
// 任務(wù)第一步,對(duì)js文件進(jìn)行處理
gulp.src('js/*.js') //加載所有的js
.pipe(concat('all.min.js'))//調(diào)用合并組件方法concat(),合并這些js.并起一個(gè)新的名稱
//任務(wù)第二步,對(duì)合并的文件進(jìn)行壓縮
.pipe(uglify()) //調(diào)用壓縮組件方法uglify()
.pipe(gulp.dest('dist/js')); //輸出到目標(biāo)目錄

//任務(wù)第三步,對(duì)jsp文件進(jìn)行處理.
gulp.src('index.jsp') //加載源jsp.
.pipe(cheerio(function ($) { //調(diào)用cheerio插件進(jìn)行dom操作
$('script').remove(); //cheerio類似于jquery dom操作. 通過(guò)jq操作移除原節(jié)點(diǎn),append新節(jié)點(diǎn)
$('head').append('<script src="js/all.min.js"></script>');

  }))

.pipe(gulp.dest('dist'));

});

</pre>
命令行,或者idea運(yùn)行 gulp的任務(wù).即可得到結(jié)果


Paste_Image.png

這里有一個(gè)坑.,能看到運(yùn)行結(jié)果并不是我們期望的完好的jsp. 頁(yè)面的jsp標(biāo)簽亂掉了.
這是因?yàn)閏heerio 插件他在做dom操作的時(shí)候,首先需要把源文件html進(jìn)行智能補(bǔ)全處理,會(huì)把未結(jié)束的標(biāo)簽補(bǔ)齊.他本身是操作html的.并不支持jsp的dom操作.
當(dāng)然,我們也有處理的辦法.稍微調(diào)整一下任務(wù)代碼.在調(diào)用cheerio 之前,先把jsp標(biāo)簽的<% 和%>替換掉. 這樣cheerio 會(huì)以為他們是普通的字符串.等cheerio 處理結(jié)束后,我們?cè)谔鎿Q回來(lái).
<pre>
gulp.task('testConcat2', function () {

  gulp.src('js/*.js')
    .pipe(concat('all.min.js'))//合并后的文件名
    .pipe(uglify())
    .pipe(gulp.dest('dist/js'));

  gulp.src('index.jsp')
     .pipe(replace("<%","~%")) //替換掉jsp標(biāo)簽的<%
     .pipe(replace("%>","%~"))//替換掉jsp標(biāo)簽的<%
     .pipe(cheerio(function ($) {
        $('script').remove();
                $('head').append('<script src="js/all.min.js"></script>');
       
     }))
     .pipe(replace("%~","%>")) //替換回來(lái)jsp標(biāo)簽的<%
     .pipe(replace("~%","<%"))//替換回來(lái)jsp標(biāo)簽的<%
    .pipe(gulp.dest('dist'));

});
</pre>

這樣,一個(gè)簡(jiǎn)單的jsp上場(chǎng)景就用gulp做了壓縮優(yōu)化處理了.最終結(jié)果

Paste_Image.png
Paste_Image.png

當(dāng)然gulp還有很多其他插件,比如壓縮html內(nèi)容.混淆壓縮js等等.按照情況選用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市热幔,隨后出現(xiàn)的幾起案子乐设,更是在濱河造成了極大的恐慌,老刑警劉巖绎巨,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件近尚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡场勤,警方通過(guò)查閱死者的電腦和手機(jī)戈锻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)和媳,“玉大人格遭,你說(shuō)我怎么就攤上這事〈凹郏” “怎么了如庭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我坪它,道長(zhǎng)骤竹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任往毡,我火速辦了婚禮蒙揣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘开瞭。我一直安慰自己懒震,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布嗤详。 她就那樣靜靜地躺著个扰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪葱色。 梳的紋絲不亂的頭發(fā)上递宅,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音苍狰,去河邊找鬼办龄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淋昭,可吹牛的內(nèi)容都是我干的俐填。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼翔忽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼英融!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起呀打,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矢赁,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后贬丛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡给涕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年豺憔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片够庙。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恭应,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耘眨,到底是詐尸還是另有隱情昼榛,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布剔难,位于F島的核電站胆屿,受9級(jí)特大地震影響奥喻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜非迹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一环鲤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憎兽,春花似錦冷离、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至亿汞,卻和暖如春蔫耽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背留夜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工匙铡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碍粥。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓鳖眼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嚼摩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钦讳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 在現(xiàn)在的前端開(kāi)發(fā)中,前后端分離枕面、模塊化開(kāi)發(fā)愿卒、版本控制、文件合并與壓縮潮秘、mock數(shù)據(jù)等等一些原本后端的思想開(kāi)始...
    Charlot閱讀 5,433評(píng)論 1 32
  • 前言 本文默認(rèn)你已經(jīng)安裝好node環(huán)境琼开,并且熟悉node命令,和window cd命令枕荞。 gulp簡(jiǎn)介 基于nod...
    9I閱讀 1,976評(píng)論 4 50
  • gulpjs是一個(gè)前端構(gòu)建工具柜候,與gruntjs相比,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù)躏精,API也非常簡(jiǎn)單渣刷,學(xué)...
    依依玖玥閱讀 3,149評(píng)論 7 55
  • gulpjs是一個(gè)前端構(gòu)建工具,與gruntjs相比矗烛,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù)辅柴,API也非常簡(jiǎn)單,學(xué)...
    井皮皮閱讀 1,292評(píng)論 0 10
  • gulpjs是一個(gè)前端構(gòu)建工具,與gruntjs相比碌嘀,gulpjs無(wú)需寫一大堆繁雜的配置參數(shù)涣旨,API也非常簡(jiǎn)單,學(xué)...
    小裁縫sun閱讀 922評(píng)論 0 3