解析前端構建工具webpack

前言

真快呀,過年的時候才對webpack 1的了點感性認識,就做了兩個關于Vue的項目,之后就出了webpack 2,怕來不及記錄,所以寫這篇文章來記錄一下Webpack 2。

Webpack概述

webpack is a module bundler for modern JavaScript applications.

上述是來自官方文檔的定義,說白了就是webpack = module bundler(加載器),對于webpack來說,所有的文件都是模塊,只是處理的方式不一樣罷了。

說道學習webpack的難易程度:

It is incredibly configurable, but to get started you only need to understand Four Core Concepts: entry, output, loaders, and plugins.
官網說:「很容易的,只要理解了entry、output、loaders、plugins這四個核心概念,你就入門了!」

所以要好好學英語呀,當然還有一些cli/nodeJS的知識。

webpack配置文件

要想使用webpack,其根目錄下會有一個webpack.config.js的文件,大概是這樣:

// webpack.config.js
var webpack = require("webpack");
var DefinePlugin = require('webpack/lib/DefinePlugin');
module.exports =  { 
        context:process.cwd(),
        watch: true,
        entry: './index.js',
        devtool: 'source-map',
        output: {
            path: path.resolve(process.cwd(),'dist/'),
            filename: '[name].js'
        },
        resolve: {
            alias:{ jquery: process.cwd()+'/src/lib/jquery.js', }
        },
        plugins: [
            new webpack.ProvidePlugin({
                $: 'jquery',
                _: 'underscore',
                React: 'react'
            }),
            new DefinePlugin({
              'process.env': {
                'NODE_ENV': JSON.stringify('development')
              }
            })
        ],
        module: {
            loaders: [{
                test: /\.js[x]?$/,
                exclude: /node_modules/,
                loader: 'babel-loader'
            },  {
                test: /\.less$/,
                loaders:['style-loader', 'css-loader','less-loader']
            }, {
                test: /\.(png|jpg|gif|woff|woff2|ttf|eot|svg|swf)$/,
                loader: "file-loader?name=[name]_[sha512:hash:base64:7].[ext]"
            }, {
                test: /\.html/,
                loader: "html-loader?" + JSON.stringify({minimize: false })
            } ]
        }
    };

這個簡單的webpack配置文件,基本可以處理大多數的前端業務場景了。

解讀webpack配置文件

講解內容還是以一個Github項目為主:地址

四個核心概念

1. entry

entry就是整個模塊的讀取入口,根據webpack 2的文檔,對entry值有了更多的拓展

    let base ='./index.js'
    
    //let base = {
    //    index:'./index.js',
    //    index1:'./index1.js'
    //};

    // webpack2 提供了多種配置方案   https://webpack.js.org/configuration/entry-context/#entry
    // const dynamic_entry = ()=>base;

    // const dynamic_entry_promise=()=>{
    //  return new Promise((resolve,reject)=>{
    //      resolve(base)
    //  })
    // }


    module.exports = {
        entry:base,
        output: {
            filename: '_[name].js' 
        }
    };

2. output

output這個對象的設置告訴webpack怎樣的放置導出的文件。

    //文檔  https://webpack.js.org/configuration/output/
    const path =require('path');
    let base = {
        index:'./index.js',
        index1:'./index1.js'
    };

    module.exports = {
        entry:base,
        output: {
            // 設置導出模塊 使用絕對路徑 
            path: path.resolve(__dirname, 'dist'),
            // 使用 on-demand-loading 或者加載其余的資源如:圖片、文件等
            //  起了服務器,設置關于導出文件目錄 公共的路徑(URL) 
            publicPath: "/output/dist/",
            // 設置包規范格式(寫一些模塊給別人用,設置過后會根據所給類型打包源碼 也有amd cmd的規范)
            libraryTarget:'umd',
            // 給自己的庫起的名字,跟amd規范里difine的中的第一個參數一樣
            library: "MyLibrary", 
            // 除entry以外的那些需要加載的文件命名
            // chunkhash => webpack對每一個文件編譯產生的hash
            chunkFilename:'[chunkhash]_[name].js',
            // hash值的設置
            hashDigestLength:3,
            // 導出文件名
            // hash ==> webpack編譯過程產生的hash值
            filename: '[hash]_[name].js'
        }
    };

3. modules/loaders

對每一個不同文件的處理方式的設定

//webpack 1的寫法
    module: {
        loaders: [{
            test: /\.js[x]?$/,
            exclude: /node_modules/,
            loader: 'babel-loader'
        }]
    }
    // webpack 2的寫法
    module:{
        rules:[
                {
                // 是Rule.resource.test的簡寫 
                // 作用就是檢測condition是否匹配這個resource query 
                // 是就使用loader編譯,反之不用,僅僅是預處理
                test: /\.jsx?$/,
                // rule.use是數組形式和rule.loaders是它的別名
                use:[{
                    loader: "babel-loader",
                }]
            },
        ]
    }

4. plugins

plugin是Webpack構建過程中的個性化的處理設置。其中有一些自帶的插件。參考文檔

    plugins: [
        // 自帶的壓縮代碼的插件
       new webpack.optimize.UglifyJsPlugin({
           compress: {
               warnings: false
           }
       })
    ]

這一部分,不知如何講好,找了一些文檔來輔助,輔助文檔

以上是核心的四個概念和部分常用配置參數的講解。

5. resolve

These options change how modules are resolved.
resolve.alias的作用就是對module模塊提供別名,和require里的path參數有相似的作用。(可以將一些需要多次引用的模塊改成一些東西)

resolve:{
    alias:{
        jquery :path.resolve(__dirname,'/src/lib/jquery.js')
    }
  }

6. devtool

這個是大招了,可以讓我們在瀏覽器的調試工具調試的是否是源碼。
如果想要顯示源碼,就用devtool:source-map

module.exports = {
  // https://webpack.js.org/configuration/devtool/#devtool
  devtool:'source-map',
  // https://webpack.js.org/configuration/target/#target
  target:"web",
  entry:"./index.js",
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js'
  },
};

文章只是對webpack一些參數進行了講解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • GitChat技術雜談 前言 本文較長,為了節省你的閱讀時間,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,709評論 7 110
  • 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 webpack介紹和使用 一、webpack介紹 1、由來 ...
    it筱竹閱讀 11,217評論 0 21
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,218評論 7 35
  • 記得2004年的時候,互聯網開發就是做網頁,那時也沒有前端和后端的區分,有時一個網站就是一些純靜態的html,通過...
    陽陽陽一堆陽閱讀 3,327評論 0 5
  • 本人,性別女,大三黨一枚,就讀于浙江某所普通二本院校,環境設計專業,作圖狗一只,屬于經常和電腦死k族,患有嚴重的拖...
    查理冰塊閱讀 280評論 0 2