成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Gulp--手把手教你搭建前端自動化平臺

LeviDing / 2869人閱讀

摘要:前端的發(fā)展真的是快,前幾年還是刀耕火種的開個編輯器,幾行和代碼就能上瀏覽器跑了。是啥官方的解釋是基于流的自動化構(gòu)建工具。把運動的半成品看成是數(shù)據(jù),那么流動的數(shù)據(jù)就是流。分工明確才能提高效率,這是社會發(fā)展的經(jīng)驗總結(jié)。

前端的發(fā)展真的是快,前幾年還是刀耕火種的開個編輯器,幾行html和js代碼就能上瀏覽器跑了?,F(xiàn)在呢?各種包,各種庫,各種框架,各種編程范式。究其原因,就是我們高中社會課本中那句話

人民日益增長的文質(zhì)文化需求,同落后的社會生產(chǎn)之間的矛盾

想想也是,以前刀耕火種的編寫頁面效率非常低,而我國到目前為止網(wǎng)民的數(shù)量已經(jīng)超過7億了,可想而知對網(wǎng)頁數(shù)量和多樣化的需求巨大,那有什么方法來提高頁面的生產(chǎn)效率呢?這就是我今天要講的基于gulp平臺的自動化生產(chǎn)平臺。
gulp是啥?官方的解釋是基于流的自動化構(gòu)建工具。好,那什么是流呢?這個流是從英語單詞stream翻譯過來的,不過還是不好理解。其實可以這么理解,流就是工廠的一個生產(chǎn)車間生產(chǎn)出來的半成品,一個個半成品在輸送帶上送往下一個加工車間的過程。把運動的半成品看成是數(shù)據(jù),那么流動的數(shù)據(jù)就是流。唉!好難解釋啊!還是看代碼吧。我已經(jīng)把代碼上傳到github了,需要的同學(xué)自取,麻煩點個小星星 https://github.com/NicknameID...

1.依賴npm

由于npm在國內(nèi)比較慢,所以推薦大家使用淘寶的cnpm,在國內(nèi)訪問比較快(搞不懂國家為什么立堵墻,難受)。

2.cnpm init 初始化package.json文件

-y的作用可以跳過詢問步驟直接生成默認(rèn)的package.json文件

3.安裝依賴包

由于依賴包太多了,就不一個一個寫了 主要通過 cnpm install --save-dev 包的名字的方式來安裝的,
下圖所列的就是自動化工具要用的包,我已經(jīng)上傳到github上了點擊這里獲取,
下載后只要 cnpm install就可以了,就會根據(jù)package.json里的依賴去下載安裝

在package.json中添加gulp字段方便調(diào)用本地安裝的gulp命令,到這里package.json配置好了

4.gulpfile.js文件的內(nèi)容(重點

功能1---自動化生成項目目錄

//gulpfile.js
/*首先在全局上加載gulp,這個很重要*/
const gulp = require("gulp");
/*在全局上定義項目的目錄結(jié)構(gòu),供應(yīng)后面使用*/
const dirs = {
  dist:"./dist",
  src: "./src",
  css: "./src/css",
  less: "./src/less",
  js: "./src/js",
  img: "./src/img",
};
gulp.task("create-directory", () => {
  const mkdirp = require("mkdirp"); //這里要依賴mkdirp這個包,通過cnpm 安裝
  for (let i in dirs) {
    mkdirp(dirs[i], err => {
      err ? console.log(err) : console.log("mkdir-->" + dirs[i]);;
    });
  }
});
//在終端運行cnpm run gulp create-directory

生成需要生成的項目目錄,再也不用每次都去手工創(chuàng)建了,幸福感爆棚有木有?。。?br>

功能2---編譯less,并且實現(xiàn)less注入功能,熱更新頁面,方便開發(fā)時調(diào)試
這個功能要依賴的插件有

1.gulp-less
2.browser-sync
3.gulp-notify
4.gulp-plumber

/*全局定義要處理的文件*/
const files = {
  lessFiles: "./src/less/go.less",
  cssFiles: "./src/css/*.css",
  jsFiles: "./src/js/*.js",
  imgFiles:"./src/img/*.*"
}
//編譯less
gulp.task("compile-less", () => {
const less = require("gulp-less"); //依賴gulp-less的插件
const notify = require("gulp-notify"); 
const plumber = require("gulp-plumber");
const browserSync = require("browser-sync").create(); //browser-sync同步服務(wù)器
const reload = browserSync.reload; //將browser-sync的reload方法存起來,方便調(diào)用
  return gulp.src(files.lessFiles)
  .pipe(plumber({ errorHandler: notify.onError("Error: <%= error.message %>") })) //使用gulp-notify和gulp-plumber用來阻止因為less語法寫錯跳出監(jiān)視程序發(fā)生
  .pipe(less())
  .pipe(gulp.dest(dirs.css + "/"))
  .pipe(reload({stream: true}));
});

// 本地服務(wù)器功能,自動刷新(開發(fā)環(huán)境)
gulp.task("server", ["compile-less"],()=>{
const browserSync = require("browser-sync").create();
const reload = browserSync.reload;
  browserSync.init({
    server: "./"
  });
  gulp.watch(dirs.less+"/**/*.less", ["compile-less"]); //監(jiān)視less文件夾中的所有l(wèi)ess文件,有改動就調(diào)用compile-less任務(wù)編譯less
  gulp.watch("./*.html").on("change", reload); //監(jiān)視html文件,有改動就刷新瀏覽器
  gulp.watch(dirs.js+"/**/*.js").on("change", reload); //監(jiān)視所有js文件有改動就刷新瀏覽器
});
//在cmd運行cnpm run gulp server

可以看到程序正在后臺運行,正在監(jiān)聽文件改動

這樣就可以左邊開著編輯器寫代碼,右邊開著瀏覽器看效果了,有木有很爽,人生別無他求了(感動中?。。。?br>

功能3---添加瀏覽器私有前綴
要用到的插件包

1.gulp-postcss
2.gulp-sourcemaps
3.autoprefixer

//添加瀏覽器私有前綴(生產(chǎn)環(huán)境)
gulp.task("autoprefixer", () => {
  const postcss = require("gulp-postcss");
  const sourcemaps = require("gulp-sourcemaps");
  const autoprefixer = require("autoprefixer");
  return gulp.src(files.cssFiles)
    .pipe(sourcemaps.init()) //添加sourcemap,方便調(diào)試
    .pipe(postcss([ autoprefixer() ])) //添加瀏覽器私有前綴,解決瀏覽器的兼容問題
    .pipe(sourcemaps.write("."))
    .pipe(gulp.dest(dirs.css+"/"))
});

功能4---壓縮css
要用到的插件包

1.gulp-minify-css
2.gulp-rename

// 壓縮css(生產(chǎn)環(huán)境)
gulp.task("minify-css", function () {
  const minifyCSS = require("gulp-minify-css");
  const rename = require("gulp-rename");
  return gulp.src(dirs.css+"/**/*.css")
    .pipe(minifyCSS({/*keepBreaks: true*/}))
    .pipe(rename(path=>path.basename += ".min")) //重命名文件輸出后的樣式為 原文件名.min.css
    .pipe(gulp.dest("./dist/css/"))
});

功能5---合并壓縮JavaScript文件
要用到的插件包

1.gulp-concat
2.gulp-uglify
3.gulp-rename

// js文件--合并--壓縮(生產(chǎn)環(huán)境)
gulp.task("js-concat-compress", (cb)=>{
  let name = ""; //先定義一個變量將用于后面存文件名
  const concat = require("gulp-concat");
  const uglify = require("gulp-uglify");
  const rename = require("gulp-rename");
  return gulp.src(dirs.js+"/**/*.js")
  .pipe(rename(path=>{path.basename += "";name=path.basename;}))
  .pipe(concat("bundle.js"))   //合并js文件
  .pipe(uglify())         //壓縮js文件
  .pipe(rename(path=>{
    path.basename = name+"."+path.basename+".min";  //改文件名加上 .min
  }))
  .pipe(gulp.dest("dist/js/")); 
});

功能6---圖片無損壓縮
要用到的插件包

1.gulp-imagemin

// 圖片無損壓縮
gulp.task("img-handl",()=>{
  const imagemin = require("gulp-imagemin");
  return gulp.src(files.imgFiles)
    .pipe(imagemin())  //imagemin()里是可以寫參數(shù)的,有需要的可以去github的頁面看看
    .pipe(gulp.dest("./dist/img/"))
});

功能7---項目的打包
有時候我們做完東西需要打包,方便傳輸,而有些文件又是不需要打包進去的,比如說node_modules文件夾,一鍵打包的快感體驗過絕對會愛上的

依賴的插件包
1.gulp-zip

// 項目打包(生產(chǎn)環(huán)境)
gulp.task("zip",()=>{
  const zip = require("gulp-zip");
  return gulp.src(["./*.html","**/dist/**/*.*","!**/node_modules/**/*.*"]) //這里需要注意的是,在寫要打包的文件時,避免打包的文件不能寫在開頭,這里"!**/node_modules/**/*.*"放在了最后
  .pipe(zip("project.zip"))   //打包后的文件名,自己隨意取
  .pipe(gulp.dest("./"))
});
5.整理任務(wù)執(zhí)行,方便調(diào)用任務(wù)

因為gulp執(zhí)行任務(wù)時是以最大的任務(wù)并發(fā)數(shù)同時進行的,所以有時候我們需要按步驟進行,就需要插件gulp-sequence,將任務(wù)按順序?qū)懭?,就會按順序?zhí)行
寫了這么多功能模塊,需要好好的整理一下,方便調(diào)用。我已經(jīng)把完整的代碼上傳到github了,需要的同學(xué)自取,麻煩點個小星星 https://github.com/NicknameID...

// ------------------開發(fā)階段命令----------------------------------------------------
gulp.task("start", ["create-directory"]); //項目初始化的第一個命令
gulp.task("dev-watch", ["server"]); //開始編寫項目后開啟服務(wù)器實時更新

// ------------------生產(chǎn)階段命令------------------------------------------------------
gulp.task("prefixer", ["autoprefixer"]); //給css文件添加瀏覽器私有前綴 files.cssFiles ==>> .src/css/
gulp.task("min-css", ["minify-css"]); //壓縮css文件 files.cssFiles ==>> dist/css/
gulp.task("js-handl", ["js-concat-compress"]); //合js文件  dirs.js/**/*.js ==>> ./dist/js/concated.js
gulp.task("img-handl", ["img-handl"]) //處理圖片,對圖片進行無損的壓縮

//----------------一鍵生成項目文件命令-----------------------------------------------
       //因為gulp執(zhí)行任務(wù)時是以最大的任務(wù)并發(fā)數(shù)同時進行的,所以有時候我們需要按步驟進行,就需要插件`gulp-sequence`,將任務(wù)按順序?qū)懭?,就會按順序?zhí)行
const runSequence = require("gulp-sequence").use(gulp);
gulp.task("bunld-project",runSequence("clean-dist","compile-less","autoprefixer","minify-css","js-concat-compress","img-handl","zip"))
6.小結(jié)

看到?jīng)]有,使用gulp其實并沒有用到很多本身的API,都是通過不同的插件來實現(xiàn)的處理過程,所以gulp更加像一個處理平臺,而非大包大攬的處理程序,他只負責(zé)數(shù)據(jù)的流向,從pipe(管道)的這頭流向另外一頭,剩下的事情就交給各個插件了,像不像現(xiàn)代社會的細化分工。分工明確才能提高效率,這是社會發(fā)展的經(jīng)驗總結(jié)。文章有點長,感謝看完的小伙伴?。?!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84502.html

相關(guān)文章

  • 搭建博客太簡單,這次我們來做一個博客生成工具

    摘要:代碼如下首頁的模版博客網(wǎng)站的基本配置菜單生成,這里不講講中的遍歷,然后生成一個數(shù)組默認(rèn)按發(fā)布時間排序置頂替換五集成在編譯博客的過程中,一些操作利用會簡單快捷許多。 文章較長,耐心讀下來我想你肯定會有所收獲 : ) 作為一個技術(shù)人員,見到別人那光鮮亮麗的個人博客,心里總免不了想搭建自己博客的沖動。當(dāng)然,搭建博客的方式有好多種,但是大體上分這兩種: 服務(wù)端數(shù)據(jù)庫例如:你可以用 Word...

    chanthuang 評論0 收藏0
  • 把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(二)

    摘要:上一篇文章手把手教你如何用構(gòu)建技術(shù)文章聚合平臺一介紹了如何使用搭建的運行環(huán)境,并且將與集成,對掘金進行技術(shù)文章的抓取,最后可以查看抓取結(jié)果。本篇文章將繼續(xù)講解如何利用編寫一個精簡的聚合平臺,將抓取好的文章內(nèi)容展示出來。 上一篇文章《手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(一)》介紹了如何使用搭建Crawlab的運行環(huán)境,并且將Puppeteer與Crawlab集成,對掘金、...

    zhunjiee 評論0 收藏0
  • webpack 教程資源收集

    學(xué)習(xí)的過程中收藏了這些優(yōu)秀教程和的項目,希望對你有幫助。 github地址, 有不錯的就更新 官方文檔 中文指南 初級教程 webpack-howto 作者:Pete Hunt Webpack 入門指迷 作者:題葉   webpack-demos 作者:ruanyf 一小時包教會 —— webpack 入門指南 作者:VaJoy Larn   webpack 入門及實踐 作者:...

    Backache 評論0 收藏0
  • 教你用Vue漸進式搭建聊天室,從JavaScript=>TypeScript

    摘要:前言這個輪子已經(jīng)有很多人造過了,為了不重復(fù)造輪子,我將本項目以三階段實現(xiàn)大家可以在中的查看純前端后端前端后端前端希望能給大家一個漸進學(xué)習(xí)的經(jīng)驗。 前言 Vue+Socket.io這個輪子已經(jīng)有很多人造過了,為了不重復(fù)造輪子,我將本項目以三階段實現(xiàn)(大家可以在github中的Releases查看): 純前端(Vuex) 后端+前端(JavaScript) 后端+前端(TypeScrip...

    skinner 評論0 收藏0
  • 把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(一)

    摘要:本文將介紹如何使用和抓取主流的技術(shù)博客文章,然后用搭建一個小型的技術(shù)文章聚合平臺。是谷歌開源的基于和的自動化測試工具,可以很方便的讓程序模擬用戶的操作,對瀏覽器進行程序化控制。相對于,是新的開源項目,而且是谷歌開發(fā),可以使用很多新的特性。 背景 說到爬蟲,大多數(shù)程序員想到的是scrapy這樣受人歡迎的框架。scrapy的確不錯,而且有很強大的生態(tài)圈,有g(shù)erapy等優(yōu)秀的可視化界面。但...

    LinkedME2016 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<