gulp構(gòu)建項(xiàng)目并發(fā)布yarnpkg

初步準(zhǔn)備

1.新建項(xiàng)目 cxy-pages
2.創(chuàng)建項(xiàng)目描述文件 yarn init
3.項(xiàng)目中新增lib/index.js并在package.json 文件中增加"main": "lib/index.js"

下載主要依賴(運(yùn)行依賴)

1.yarn add gulp --save
2.yarn add gulp-load-plugins --save自動(dòng)加載package.json文件里的 gulp 插件

導(dǎo)入基本功能
//-----index.js---------------------------
// 實(shí)現(xiàn)這個(gè)項(xiàng)目的構(gòu)建任務(wù)
const { src, dest, parallel, series, watch } = require('gulp')
// 統(tǒng)一管理gulp的組件
const loadPlugins = require('gulp-load-plugins')
const plugins = loadPlugins()
// 獲取工程目錄
const cwd = process.cwd()
module.exports = {}

設(shè)置資源路徑
//默認(rèn)配置
let config = {
    build:{
        src:'src',//項(xiàng)目業(yè)務(wù)源代碼路徑
        dist:'dist',//發(fā)布文件路徑
        temp:'temp',//臨時(shí)文件路徑,開發(fā)模式下讀取路徑
        public:'public',//公共靜態(tài)資源路徑
        paths:{
            styles:'assets/styles/**/*.scss',//樣式路徑
            scripts:'assets/scripts/**/*.js',//js文件路徑
            pages:'**/*.html',//靜態(tài)頁面路徑
            images:'assets/images/**',//圖片路徑
            fonts:'assets/fonts/**',//字體路徑
        }
    }
}
try {
  //讀取用戶pages.config.js配置
  const loadConfig = require(`${cwd}/pages.config.js`)
  config = Object.assign({},config,loadConfig) 
} catch (error) {}
刪除發(fā)布文件夾

yarn add del --save

//...省略號(hào)代表折疊了部分代碼
...
const del = require('del')
const clean = () => {
    // 刪除dist,及temp文件下內(nèi)容
    return del([config.build.dist, config.build.temp])
}
module.exports = {
    clean
}
處理style(scss)

yarn add gulp-sass --save

//...省略號(hào)代表折疊了部分代碼
...
const style = () => {
    return src(config.build.paths.styles, { base: config.build.src, cwd: config.build.src})
        .pipe(plugins.sass({ outputStyle: 'expanded' }))//輸出格式展開
        .pipe(dest(config.build.temp))//目標(biāo)地址
}
module.exports = {
    clean求冷,
    style 
}
處理javascript

yarn add gulp-babel @babel/core @babel/preset-env --save

//...省略號(hào)代表折疊了部分代碼
...
const script = () => {
    // 使用gulp-babel需要同時(shí)安裝@babel/core 和 @babel/present
    return src(config.build.paths.scripts, { base: config.build.src, cwd: config.build.src })
        .pipe(plugins.babel({ presets: [require('@babel/preset-env')] }))//presets參數(shù)設(shè)置轉(zhuǎn)化版本
        .pipe(dest(config.build.temp))//目標(biāo)地址
}
module.exports = {
    ...
    script  
}
處理html文件

yarn add gulp-swig --save

//...省略號(hào)代表折疊了部分代碼
...
const page = () => {
    return src(config.build.paths.pages, { base: config.build.src, cwd: config.build.src })
        .pipe(plugins.swig({ data:config.data }))//頁面模板中接收配置文件中的數(shù)據(jù)
        .pipe(dest(config.build.temp))//目標(biāo)地址
}
module.exports = {
    ...
    page
}
處理圖片和字體

yarn add gulp-imagemin --save

//...省略號(hào)代表折疊了部分代碼
...
const image = () => {
    return src(config.build.paths.images, { base: config.build.src, cwd: config.build.src })
        .pipe(plugins.imagemin())//壓縮圖片
        .pipe(dest(config.build.dist))//開發(fā)模式不需要頻繁壓縮晰筛,所以直接導(dǎo)到dist恭取,生產(chǎn)模式使用
}
const font = () => {
    return src(config.build.paths.fonts, { base: config.build.src, cwd: config.build.src })
        .pipe(plugins.imagemin())//壓縮字體
        .pipe(dest(config.build.dist))//開發(fā)模式不需要頻繁壓縮僧须,所以直接導(dǎo)到dist,生產(chǎn)模式使用
}
module.exports = {
    ...
    image,
    font 
}
處理公共靜態(tài)資源
//...省略號(hào)代表折疊了部分代碼
...
const extra = () => {
    //靜態(tài)資源不需要特殊處理直接導(dǎo)到temp
    return src('**', { base: config.build.public, cwd: config.build.public })
        .pipe(dest(config.build.temp))
}
module.exports = {
    ...
    extra  
}
開發(fā)模式監(jiān)聽代碼變化并刷新

yarn add browser-sync --save

//...省略號(hào)代表折疊了部分代碼
...
const browserSync = require('browser-sync')
const bs = browserSync.create()
...
const style= () => {
    return ...
        .pipe(bs.reload({ stream: true }))
}
const script= () => {
    return ...
        .pipe(bs.reload({ stream: true }))
}
const page = () => {
    return ...
        .pipe(bs.reload({ stream: true }))
}
...
const serve = () => {
    watch(config.build.paths.styles,{ cwd:config.build.src }, style)
    watch(config.build.paths.scripts, { cwd: config.build.src }, script)
    watch(config.build.paths.pages, { cwd: config.build.src }, page)

    watch([
        config.build.paths.images,
        config.build.paths.fonts
    ],{cwd:config.build.src}, bs.reload)

    watch('**', { cwd: config.build.public }, bs.reload)
    bs.init({
        notify: false,
        port: 8080,
        // open:false,
        // files: 'temp/**',
        server: {
            baseDir: [config.build.temp, config.build.src, config.build.public],//文件默認(rèn)查找地址讀取順序
            routes: {
                '/node_modules': 'node_modules'
            }
        }
    })
}
合并及壓縮文件

yarn add gulp-useref gulp-if gulp-uglify gulp-clean-css gulp-htmlmin

//...省略號(hào)代表折疊了部分代碼
...
const path = require('path')
const useref = () => {
    // return src( config.build.paths.pages, {  base: config.build.temp ,cwd: config.build.temp })
    return src(path.join(config.build.temp, config.build.paths.pages), {  base: config.build.temp })
        .pipe(plugins.useref({ searchPath: [config.build.temp, '.'] }))
        .pipe(plugins.if(/\.js$/, plugins.uglify()))
        .pipe(plugins.if(/\.css$/, plugins.cleanCss()))
        .pipe(plugins.if(/\.html$/, plugins.htmlmin({
            collapseWhitespace: true,//去掉空格
            minifyCss: true,//壓縮html的style標(biāo)簽中的css
            minifyJS: true//壓縮html的script標(biāo)簽中的css
        })))
        .pipe(dest(config.build.dist))
}
module.exports = {
    ...
    useref 
}
整理編譯模式
//...省略號(hào)代表折疊了部分代碼
...
//編譯css+js+html
const compile = parallel(style, script, page) 
//開發(fā)模式編譯+監(jiān)聽
const dev = series(compile, serve)
//打包到dist
const build = series(clean, parallel(series(compile, useref), image, font, extra))

module.exports = {
    clean幢码,//清除編譯文件
    dev己莺,//開發(fā)模式編譯運(yùn)行
    build //打包
}
設(shè)置默認(rèn)執(zhí)行腳本

1.項(xiàng)目中新增bin/cxy-pages.js并在package.json 文件中增加

//...省略號(hào)代表折疊了部分代碼
{
...
  "main": "lib/index.js",
  "bin":"bin/cxy-pages.js",
  "files":[
    "lib",
    "bin"
  ],
...
}

2.在cxy-pages.js 中

#!/usr/bin/env node

process.argv.push('--cwd')
process.argv.push(process.cwd())
process.argv.push('--gulpfile')
process.argv.push(require.resolve('..'))//cxy-pages目錄的絕對(duì)路徑

require('gulp/bin/gulp')
本地使用

1.通過yarn link 連接到全局
2.通過cxy-pages build|dev|clean 使用

發(fā)布到y(tǒng)arnpkg上使用

1.yarn publish發(fā)布
2.在需要用到的項(xiàng)目目錄下 yarn add cxy-pages --dev 下載使用
3.可以通過修改其項(xiàng)目中的script去定義編譯腳本
4.一些配置數(shù)據(jù),如html中的data內(nèi)容和編譯文件路徑等凌受,可以通過在項(xiàng)目根目錄中新建pages.config.js并配置。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胜蛉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子誊册,更是在濱河造成了極大的恐慌奈梳,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件解虱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡漆撞,警方通過查閱死者的電腦和手機(jī)殴泰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門于宙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悍汛,你說我怎么就攤上這事捞魁。” “怎么了离咐?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵谱俭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我宵蛀,道長(zhǎng)昆著,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任术陶,我火速辦了婚禮凑懂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梧宫。我一直安慰自己接谨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布塘匣。 她就那樣靜靜地躺著脓豪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忌卤。 梳的紋絲不亂的頭發(fā)上扫夜,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音埠巨,去河邊找鬼历谍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辣垒,可吹牛的內(nèi)容都是我干的望侈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼勋桶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼脱衙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起例驹,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤捐韩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鹃锈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荤胁,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年仅政,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垢油。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滩愁。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辫封,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妻味,到底是詐尸還是另有隱情璃诀,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布棕诵,位于F島的核電站凿将,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏笛匙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一妹孙、第九天 我趴在偏房一處隱蔽的房頂上張望蠢正。 院中可真熱鬧省店,春花似錦、人聲如沸雹舀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽签财。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烛愧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工慎冤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚁堤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像立磁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唱歧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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