「本文已參與好文召集令活動,點擊查看:後端、大前端雙賽道投稿,2萬元獎池等你挑戰!」css
Gulp
單獨對樣式進行打包來實現按需引入🏇Webpack
配置插件也是能夠作到的,就當是複習鞏固一次Gulp
吧Gulp
和Webpack
的區別能夠參考我以前的文章:談談gulp和webpack?✔️node
和npm
node --version
npm --version
複製代碼
gulpBegin
中建立一個gulpfile.js
空的js
文件mkdir gulpBegin
cd gulpBegin
echo test>gulpfile.js
複製代碼
gulpfile.js
文件中定義咱們gulp
的任務了package.json
文件一直回車便可(用於存儲配置信息及版本號)npm init
複製代碼
gulp
命令行命令npm install -g gulp
複製代碼
gulp
並寫入package.json
文件的依賴npm install --save-dev gulp
複製代碼
glupBegin
├─ gulpfile.js #接下來運行的主文件
├─ node_modules
├─ package-lock.json
└─ package.json
複製代碼
Gulp 容許你使用現有
JavaScript
知識來書寫gulpfile
文件,或者利用你所掌握的gulpfile
經驗來書寫普通的JavaScript
代碼。雖然gulp
提供了一些實用工具來簡化文件系統和命令行的操做,可是你所編寫的其餘代碼都是純JavaScript
代碼。html
gulp
是能夠用JavaScript
代碼來進行書寫,咱們來編寫第一個任務/* gulpfile.js */
function gulpFun() {
console.log('hi gulp')
}
exports.default=gulpFun //導出一個默認任務 default成員
複製代碼
gulpfile.js
所在的目錄的命令行執行gulp
便可gulp
當中,它取消了同步任務模式,約定咱們的每一個任務必須是異步任務,當咱們的任務執行完成事後,咱們須要經過調用回調函數去標識這個任務已經完成gulp
+任務名稱
/* gulpfile.js */
function gulpFun(cb) {
console.log('hi gulp')
cb()
}
exports.task1=gulpFun //導出一個task1成員
複製代碼
series()
和 parallel()
series()
會讓任務們依次執行/* gulpfile.js */
const { series } = require('gulp');
function gulpFun(cb) {
//任務1
console.log('hi gulp')
cb()
}
function gulpFun2(cb) {
//任務2
console.log('hi 小盧')
cb()
}
exports.default=series(gulpFun,gulpFun2) //導出一個default成員
複製代碼
parallel()
會讓任務們同步執行/* gulpfile.js */
const { parallel } = require('gulp');
function gulpFun(cb) {
//任務1
console.log('hi gulp')
cb()
}
function gulpFun2(cb) {
//任務2
console.log('hi 小盧')
cb()
}
exports.default=parallel(gulpFun,gulpFun2) //導出一個default成員
複製代碼
看到這裏其實基本的gulp操做你已經學會了,但咱們使用gulp的目的無非就是爲了處理文件從而減小咱們所浪費的時間,因此咱們須要藉助gulp的api來實現前端
gulp
的Api
有挺多的但經常使用的也只有那幾個,剩下的有用到就去文檔找就能夠了讀取
出來進行一些操做轉換
再放到下一個地方
進行加工
最後再把處理好的文件寫入
到一個指定的地方.pipe(寫入流)
,實現數據寫入src()
dest()
舉個例子node
scss
文件進行測試/* gulpfile.js */
const { src,dest,series } = require('gulp');
function gulpFun(cb) {
src('./styles/text.scss')
.pipe(dest('./lib/styles'))
cb()
}
exports.default=series(gulpFun)
複製代碼
gulp
後目錄結構會變成以下所示glupBegin
├─ gulpfile.js
├─ node_modules
├─ lib
│ └─ styles
│ └─ text.scss
├─ package-lock.json
├─ package.json
└─ styles
└─ text.scss
複製代碼
gulp
在讀取了styles/text.scss
後再./lib/styles
自動生成了文件,這就是讀取和寫入流壓縮css
,壓縮js
、重命名
、css背景圖生成雪碧圖
等等,這時候就須要用到一些插件來輔助了。gulp
官網中可查的插件也有不少,若是有須要查找的能夠訪問官網css
樣式進行打包styles
目錄中有三個scss
文件styles
├─ button.scss
├─ icon.scss
└─ index.scss
複製代碼
index.scss
中import
了上面兩個scss的樣式/* index.scss */
@import "button";
@import "icon";
複製代碼
index.scss
就能夠在別的地方引入這個打包後的文件npm
下載爲了方便貼出來直接複製到package.json
執行npm install
就能夠"devDependencies": {
"gulp": "^4.0.2",
"gulp-autoprefixer": "^7.0.0",
"gulp-clean-css": "^4.2.0",
"gulp-rename": "^1.4.0",
"gulp-sass": "^4.0.2"
}
複製代碼
gulpfile.js
編寫如下代碼/* gulpfile.js */
const { src,dest,series } = require('gulp');
const cleanCSS = require('gulp-clean-css');
const sass = require('gulp-sass');
const rename = require('gulp-rename');
const autoprefixer = require('gulp-autoprefixer');
function gulpFun(cb) {
src('./styles/index.scss')
.pipe(sass()) //將sass轉化成css
.pipe(autoprefixer()) //根據瀏覽器的不一樣版本自動處理瀏覽器的前綴,實現css瀏覽器的兼容
.pipe(cleanCSS()) //壓縮css文件,減少文件大小
.pipe(rename('xl-ui.css')) //給文件重命名
.pipe(dest('./lib/styles')) //寫入這個目錄
cb()
}
exports.default=series(gulpFun)
複製代碼
gulp
打包後能夠在./lib/styles
看到xl-ui.css
文件src()
讀取而後經過引入
的各類插件
來進行處理
經過pipe
來進行管道鏈接,讓一整個流程按照順序執行
,咱們只須要把它每一個步驟須要作的事情給它規範好了
咱們以後就不須要作重複的繁瑣的操做
了index.scss
後我還想把每一個單獨組件的scss
進行打包怎麼辦呢?/* component.json */
{
"button": "./styles/button.scss",
"icon": "./styles/icon.scss"
}
複製代碼
gulpfile.js
編寫如下代碼/* gulpfile.js */
const { src,dest,series } = require('gulp');
const cleanCSS = require('gulp-clean-css');
const sass = require('gulp-sass');
const rename = require('gulp-rename');
const autoprefixer = require('gulp-autoprefixer');
const components = require('./component.json')
function gulpFun(cb) {
src('./styles/index.scss')
.pipe(sass()) //將sass轉化成css
.pipe(autoprefixer()) //根據瀏覽器的不一樣版本自動處理瀏覽器的前綴,實現css瀏覽器的兼容
.pipe(cleanCSS()) //壓縮css文件,減少文件大小
.pipe(rename('xl-ui.css')) //給文件重命名
.pipe(dest('./lib/styles')) //寫入這個目錄
cb()
}
// 打包單獨的css文件
function gulpFun2(cb) {
Object.keys(components).forEach(compName => {
src(`./styles/${compName}.scss`) //遍歷json文件中要轉化的scss文件
.pipe(sass()) //將sass轉化成css
.pipe(autoprefixer()) //根據瀏覽器的不一樣版本自動處理瀏覽器的前綴,實現css瀏覽器的兼容
.pipe(cleanCSS()) //壓縮css文件,減少文件大小
.pipe(rename(`${compName}.css`)) //給文件重命名
.pipe(dest('./lib/styles')); //寫入這個目錄
})
cb()
}
exports.default=series(gulpFun,gulpFun2)
複製代碼
gulp
打包後能夠在./lib/styles
看到xl-ui.css
文件和分開打包的css
文件glupBegin
├─ node_modules
├─ component.json
├─ gulpfile.js
├─ lib
│ └─ styles
│ ├─ button.css
│ ├─ icon.css
│ └─ xl-ui.css
├─ package-lock.json
├─ package.json
└─ styles
├─ button.scss
├─ icon.scss
└─ index.scss
複製代碼
lib
文件夾中的css
文件發現確實每一個都單獨進行了壓縮打包而且重命名gulp
命令便可gulp
對樣式進行打包,若是對於多種模塊化的js
互相引用的時候仍是用webpack
來處理吧,畢竟webpack
側重模塊化打包,會把全部的文件都統一處理成js
文件gulp
的細節也還有不少若是感興趣的話能夠去官網文檔查查看,相信聰明的你一下就能看懂Webpack的基本配置和打包與介紹(一)⚡️webpack
爲了方便,我改了別人的輪子😅json