從零開始開發(fā)一個簡易的類vue-cli構(gòu)建工具

代碼地址:https://github.com/cheer4chai/webpack-learning

仿照vue-cli開發(fā)這個工具的目的是了解webpack的基本設(shè)置搓侄,以及vue-cli的工作原理

Series1.簡單的打包構(gòu)建功能

webpack的配置很簡單:?

設(shè)置好入口文件:entry词顾,輸出文件:output

// webpack.config.js

module.exports = {

????entry: {

????????bundle1:?'./main1.js',

????????bundle2:?'./main2.js'

????},

????output: {

????????filename:?'[name].js'

????},

????module: {

????????loaders: [{

????????????test: /\.css$/,

????????????loader:?'style-loader!css-loader'

????????}]

????}

}


最終文件目錄:


我們發(fā)現(xiàn)webpack把main1.js和main2.js分別打包為了bundle1和bundle2伤为,main.css也打包到了bundle文件中蠢棱,這樣我們就初步打包成功了赊窥。


Series2.使用loader將less/css文件打包

如果在webpack中需要將less/css等一些非js文件打包至目標(biāo)文件時臊旭,我們就需要用到webpack的特性之一:loader

其實(shí)只要在webpack的配置文件中加入module字段就可以了箩退,代碼如下

let?path = require('path')

let?webpack = require('webpack');



module.exports = {

????entry:?'./src/entry.js',

????devtool:?'inline-source-map',

????output: {

????????path: path.join(__dirname,?'/dist'),

????????filename:?'bundle.js',

????????publicPath:?'/dist/'

????},

????devServer: {

????????contentBase: path.join(__dirname,?"./"),

????????hot:?true,

????},

????module: {

????????loaders: [{

????????????????test: /\.css$/,

????????????????loader:?"style-loader!css-loader"

????????????},

????????????{

????????????????test: /\.less$/,

????????????????loader:?"style-loader!css-loader!less-loader"

????????????}

????????]

????}

}

  另外值得一提的是loader是從右到左的鏈?zhǔn)讲僮骼胙缟系腸ss文件,是先經(jīng)過css-loader處理滋戳,再經(jīng)過style-loader處理喊括,才能轉(zhuǎn)化為所需要的打包格式


Series3.使用webpack-dev-server在線瀏覽效果

當(dāng)使用vue-cli的時候我們會想胧瓜,當(dāng)運(yùn)行npm run dev的時候他是怎么生成一個本地的文件的呢,其實(shí)就是用了webpack-dev-server這一個插件郑什,在本地用nodejs生成了一個服務(wù)器府喳,代理了在內(nèi)存中自動生成的靜態(tài)頁面钝满。話不多說,安裝了這個插件之后(yarn add webpack-dev-server)弯蚜,只要在項目目錄下執(zhí)行webpack-dev-server命令,訪問本地localhost:8080就可以看到這個頁面了路鹰。

但是這個時候當(dāng)我們修改了一個文件之后還需要重新用webpack編譯收厨,再刷新頁面再能看到更改內(nèi)容,那么有什么可以解決這個問題嗎雁竞?沒錯拧额,這個時候我們就需要熱重載插件:HotModuleReplacementPlugin。其實(shí)也很簡單进栽,只要在webpack的plugins內(nèi)加入這個組件捎拯,另外在devServer中配置hot為true(或者運(yùn)行的時候執(zhí)行--hot命令),就可以實(shí)現(xiàn)熱重載了祸泪。

還需要一提的是HtmlWebpackPlugin插件建芙,這個插件可以自動生成一個HTML文件,vue-cli最終的html文件就是該文件生成的右蒲,因此我們還需要這個插件去自動生成一個html文件引用output的js文件赶熟,并打開

讓我們來看一下如何配置這幾個東西:


let?path = require('path')

let?webpack = require('webpack');

let?HtmlWebpackPlugin = require('html-webpack-plugin');


module.exports = {

????entry:?'./src/entry.js',

????devtool:?'inline-source-map',

????output: {

????????path: path.join(__dirname,?'dist'),

????????filename:?'bundle.js',

????????publicPath:?'/'

????},

????devServer: {

????????hot:?true,

????????compress:?true,

????????publicPath:?'/'

????},

????module: {

????????loaders: [{

????????????????test: /\.css$/,

????????????????loader:?"style-loader!css-loader"

????????????},

????????????{

????????????????test: /\.less$/,

????????????????loader:?"style-loader!css-loader!less-loader"

????????????}

????????]

????},

????plugins: [

????????new?webpack.HotModuleReplacementPlugin(),?// 熱加載

????????new?HtmlWebpackPlugin(),

????]

}

  文件目錄如下:

在根目錄下運(yùn)行webpack-dev-server映砖,我們就可以在本地看到已經(jīng)打包后的頁面了


Series4.使用webpack-merge分別設(shè)置webpack的dev及prod模式

因?yàn)樵谌粘i_發(fā)中,我們往往會需要開發(fā)和生產(chǎn)兩種環(huán)境,而這兩個環(huán)境的webpack配置有相同的地方劳澄,又有不同的地方蜈七,這個時候我們需要用的webpack-merge來將wepack的配置分成兩個模式,類似于vue-cli那樣砂缩,分為三個文件:base/dev/build狡相,分別保存共用設(shè)置、開發(fā)用設(shè)置和生產(chǎn)設(shè)置。

文件如下:


//webpack.base.config

let?path = require('path')


module.exports = {

????entry: {

????????index:?'./src/main.js'

????},

????devtool:?'inline-source-map',

????output: {

????????path: path.join(__dirname,?'dist'),

????????filename:?'bundle.js',

????????publicPath:?'/'

????},

????resolve: {

????????extensions: ['.js',?'.vue',?'.json'],

????????alias: {

????????????'vue$':?'vue/dist/vue.esm.js'

????????}

????},

????module: {

????????loaders: [{

????????????????test: /\.vue$/,

????????????????loader:?'vue-loader'

????????????}, {

????????????????test: /\.css$/,

????????????????loader:?"style-loader!css-loader"

????????????},

????????????{

????????????????test: /\.less$/,

????????????????loader:?"style-loader!css-loader!less-loader"

????????????}

????????]

????}

}


//webpack.dev.config

let?path = require('path')

let?webpack = require('webpack');

const merge = require('webpack-merge')

const baseWebpackConfig = require('./webpack.base.config')

let?HtmlWebpackPlugin = require('html-webpack-plugin');


module.exports = merge(baseWebpackConfig, {


????devServer: {

????????hot:?true,

????????compress:?true,

????????publicPath:?'/'

????},


????plugins: [

????????new?webpack.HotModuleReplacementPlugin(),?// 熱加載

????????new?HtmlWebpackPlugin({

????????????filename:?'index.html',

????????????template:?'index.html',

????????????inject:?true

????????})

????]

})

在生產(chǎn)模式中,為了可以生成更小的文件单绑,已經(jīng)實(shí)現(xiàn)js的按需引用搂橙,我們配置webpack的CommonsChunkPlugin以及UglifyJsPlugin,其中chunk可以將頁面中引用的第三方庫單獨(dú)打包区转,而uglify顧名思義废离,則是壓縮代碼需要的插件,詳細(xì)的配置如下:



//webpack.build.config

let?path = require('path')

let?webpack = require('webpack');

const merge = require('webpack-merge')

const baseWebpackConfig = require('./webpack.base.config')


const HtmlWebpackPlugin = require('html-webpack-plugin');


module.exports = merge(baseWebpackConfig, {

????entry: {

????????index:?'./src/main.js',

????????vendor: ['jquery',?'vue']

????},

????output: {

????????path: path.join(__dirname,?'dist'),

????????filename: path.join('static',?'js/[name].[chunkhash].js'),

????????chunkFilename: path.join('static',?'js/[id].[chunkhash].js')

????},

????plugins: [

????????new?webpack.optimize.UglifyJsPlugin({

????????????compress: {

????????????????warnings:?false

????????????},

????????????sourceMap:?false,

????????????parallel:?true

????????}),

????????new?HtmlWebpackPlugin({

????????????filename:?'index.html',

????????????template:?'index.html',

????????????inject:?true,

????????????minify: {

????????????????removeComments:?true,

????????????????collapseWhitespace:?true,

????????????????removeAttributeQuotes:?true

????????????????????// more options:

????????????????????// https://github.com/kangax/html-minifier#options-quick-reference

????????????},

????????}),

????????new?webpack.optimize.CommonsChunkPlugin({

????????????name:?'ventor',

????????????minChunks: Infinity

????????})

????]

})

  目錄結(jié)構(gòu)如下圖:


Series4.配置vue文件編譯

當(dāng)我們需要向vue-cli一樣,將vue都編譯成最終的js文件的時候肖方,我們需要一個新的loader:vue-loader,另外為了讓webpack可以引入template俯画,我們還需要在webpack中配置resolve字段

改動的代碼如下:


//webpack.dev.config

let?path = require('path')

let?webpack = require('webpack');

const merge = require('webpack-merge')

const baseWebpackConfig = require('./webpack.base.config')

let?HtmlWebpackPlugin = require('html-webpack-plugin');


module.exports = merge(baseWebpackConfig, {


????devServer: {

????????hot:?true,

????????compress:?true,

????????publicPath:?'/'

????},


????plugins: [

????????new?webpack.HotModuleReplacementPlugin(),?// 熱加載

????????new?HtmlWebpackPlugin({

????????????filename:?'index.html',

????????????template:?'index.html',

????????????inject:?true

????????})

????]

})


//webpack.build.config

let?path = require('path')

let?webpack = require('webpack');

const merge = require('webpack-merge')

const baseWebpackConfig = require('./webpack.base.config')


const HtmlWebpackPlugin = require('html-webpack-plugin');


module.exports = merge(baseWebpackConfig, {

????entry: {

????????index:?'./src/main.js',

????????vendor: ['jquery',?'vue']

????},

????output: {

????????path: path.join(__dirname,?'dist'),

????????filename: path.join('static',?'js/[name].[chunkhash].js'),

????????chunkFilename: path.join('static',?'js/[id].[chunkhash].js')

????},

????plugins: [

????????new?webpack.optimize.UglifyJsPlugin({

????????????compress: {

????????????????warnings:?false

????????????},

????????????sourceMap:?false,

????????????parallel:?true

????????}),

????????new?HtmlWebpackPlugin({

????????????filename:?'index.html',

????????????template:?'index.html',

????????????inject:?true,

????????????minify: {

????????????????removeComments:?true,

????????????????collapseWhitespace:?true,

????????????????removeAttributeQuotes:?true

????????????????????// more options:

????????????????????// https://github.com/kangax/html-minifier#options-quick-reference

????????????},

????????}),

????????new?webpack.optimize.CommonsChunkPlugin({

????????????name:?'ventor',

????????????minChunks: Infinity

????????})

????]

})

項目目錄如下圖:


?如圖烹骨,我們已經(jīng)實(shí)現(xiàn)了一個簡單的類vue-cli構(gòu)建工具。詳細(xì)的代碼可以去我的github看:https://github.com/cheer4chai/webpack-learning吨岭,如果能幫助到你峦树,煩請點(diǎn)個star~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市急灭,隨后出現(xiàn)的幾起案子谷遂,更是在濱河造成了極大的恐慌,老刑警劉巖畴嘶,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窗悯,死亡現(xiàn)場離奇詭異偷拔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)莲绰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門钉蒲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人踏枣,你說我怎么就攤上這事钙蒙。” “怎么了躬厌?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屹篓。 經(jīng)常有香客問我匙奴,道長,這世上最難降的妖魔是什么泼菌? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任哗伯,我火速辦了婚禮,結(jié)果婚禮上系任,老公的妹妹穿的比我還像新娘虐块。我一直安慰自己,他們只是感情好非凌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布敞嗡。 她就那樣靜靜地躺著航背,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箕肃。 梳的紋絲不亂的頭發(fā)上今魔,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音吟宦,去河邊找鬼涩维。 笑死,一個胖子當(dāng)著我的面吹牛蜗侈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踏幻,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼叫倍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了听诸?” 一聲冷哼從身側(cè)響起蚕泽,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仔蝌,沒想到半個月后荒吏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞧挤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年特恬,在試婚紗的時候發(fā)現(xiàn)自己被綠了徐钠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡显拜,死狀恐怖摊崭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呢簸,我是刑警寧澤乏屯,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布辰晕,位于F島的核電站确虱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏校辩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一惠赫、第九天 我趴在偏房一處隱蔽的房頂上張望故黑。 院中可真熱鬧场晶,春花似錦、人聲如沸诗轻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鞠柄。三九已至嫉柴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夯尽,已是汗流浹背登馒。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圈纺,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓灯谣,卻偏偏與公主長得像蛔琅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辜窑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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