前置課程3的課堂筆記-webpack

若愚老師

安裝

//全局安裝
npm install -g webpack
//安裝到你的項(xiàng)目目錄
npm install --save-dev webpack

要安裝最新版本或特定版本,請(qǐng)運(yùn)行以下命令之一:

npm install --save-dev webpack
npm install --save-dev webpack@<version>

首先我們創(chuàng)建一個(gè)目錄,初始化 npm幔荒,然后 在本地安裝 webpack糊闽,接著安裝 webpack-cli(此工具用于在命令行中運(yùn)行 webpack):

mkdir webpack-demo && cd webpack-demo
npm init -y
npm install webpack webpack-cli --save-dev
  • 通過(guò)命令行模式實(shí)現(xiàn)
    webpack可以在終端中使用,在基本的使用方法如下:
// {extry file}出填寫入口文件的路徑爹梁,本文中就是上述main.js的路徑右犹,
// {destination for bundled file}處填寫打包文件的存放路徑
// 填寫路徑的時(shí)候不用添加{}
webpack {entry file} {destination for bundled file}

指定入口文件后,webpack將自動(dòng)識(shí)別項(xiàng)目所依賴的其它文件姚垃,不過(guò)需要注意的是如果你的webpack不是全局安裝的念链,那么當(dāng)你在終端中使用此命令時(shí),需要額外指定其在node_modules中的地址积糯,繼續(xù)上面的例子掂墓,在終端中輸入如下命令

// webpack非全局安裝的情況
node_modules/.bin/webpack app/main.js public/bundle.js
  • 通過(guò)配置文件來(lái)使用Webpack
    根目錄下新建一個(gè)名為webpack.config.js的文件
module.exports = {
  entry:   __dirname +"app.js",//已多次提及的唯一入口文件
  output: {
    path: __dirname + "/public",//打包后的文件存放的地方
    filename: "bundle.js"http://打包后輸出文件的文件名
  }
}

注:“__dirname”node.js中的一個(gè)全局變量,它指向當(dāng)前執(zhí)行腳本所在的目錄

有了這個(gè)配置之后看成,再打包文件君编,只需在終端里運(yùn)行webpack(非全局安裝需使用node_modules/.bin/webpack)命令就可以了,這條命令會(huì)自動(dòng)引用webpack.config.js文件中的配置選項(xiàng)
有了這個(gè)配置之后川慌,再打包文件吃嘿,只需在終端里運(yùn)行webpack(非全局安裝需使用node_modules/.bin/webpack)命令就可以了,這條命令會(huì)自動(dòng)引用webpack.config.js文件中的配置選項(xiàng)

更快捷的執(zhí)行打包任務(wù)
在命令行中輸入命令需要代碼類似于node_modules/.bin/webpack這樣的路徑比較麻煩窘游,通過(guò)npm進(jìn)行配置后可以在命令行中使用簡(jiǎn)單的npm start命令來(lái)替代上面略微繁瑣的命令唠椭。在package.json中對(duì)scripts對(duì)象進(jìn)行相關(guān)設(shè)置即可:

{
  "name": "webpack-sample-project",
  "version": "1.0.0",
  "description": "Sample webpack project",
  "scripts": {
    "start": "webpack"  // 修改的是這里跳纳,JSON文件不支持注釋忍饰,引用時(shí)請(qǐng)清除
  },
  "author": "zhang",
  "license": "ISC",
  "devDependencies": {
    "webpack": "3.10.0"
  }
}

loaders

loaders官方文檔
通過(guò)使用不同的loaderwebpack有能力調(diào)用外部的腳本或工具寺庄,實(shí)現(xiàn)對(duì)不同格式的文件的處理艾蓝,比如說(shuō)分析轉(zhuǎn)換scsscss,或者把下一代的JS文件(ES6斗塘,ES7)轉(zhuǎn)換為現(xiàn)代瀏覽器兼容的JS文件

Loaders需要單獨(dú)安裝并且需要在webpack.config.js中的modules關(guān)鍵字下進(jìn)行配置赢织,Loaders的配置包括以下幾方面:

  • test:一個(gè)用以匹配loaders所處理文件的拓展名的正則表達(dá)式(必須)
  • loader:loader的名稱(必須)
  • include/exclude:手動(dòng)添加必須處理的文件(文件夾)或屏蔽不需要處理的文件(文件夾)(可選);
  • query:為loaders提供額外的設(shè)置選項(xiàng)(可選)

舉個(gè)栗子:babel-loader

安裝:
 // webpack 3.x | babel-loader 8.x | babel 7.x
npm install babel-loader@8.0.0-beta.0 @babel/core @babel/preset-env webpack
 // webpack 3.x babel-loader 7.x | babel 6.x
npm install babel-loader babel-core babel-preset-env webpack
module.exports = {
  entry:   __dirname +"app.js",//已多次提及的唯一入口文件
  output: {
    path: __dirname + "/public",//打包后的文件存放的地方
    filename: "bundle.js"http://打包后輸出文件的文件名
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  }
}

插件(Plugins)

  • 插件(Plugins)是用來(lái)拓展Webpack功能的馍盟,它們會(huì)在整個(gè)構(gòu)建過(guò)程中生效于置,執(zhí)行相關(guān)的任務(wù)。
    Loaders和Plugins常常被弄混贞岭,但是他們其實(shí)是完全不同的東西八毯,可以這么來(lái)說(shuō),loaders是在打包構(gòu)建過(guò)程中用來(lái)處理源文件的(JSX瞄桨,Scss话速,Less..),一次處理一個(gè)芯侥,插件并不直接操作單個(gè)文件泊交,它直接對(duì)整個(gè)構(gòu)建過(guò)程其作用乳讥。
  • 要使用某個(gè)插件,我們需要通過(guò)npm安裝它廓俭,然后要做的就是在webpack配置中的plugins關(guān)鍵字部分添加該插件的一個(gè)實(shí)例(plugins是一個(gè)數(shù)組)
  • 幾個(gè)常用的插件:
    • HtmlWebpackPlugin:這個(gè)插件的作用是依據(jù)一個(gè)簡(jiǎn)單的index.html模板云石,生成一個(gè)自動(dòng)引用你打包后的JS文件的新index.html。這在每次生成的js文件名稱不同時(shí)非常有用(比如添加了hash值)研乒。
      npm install --save-dev html-webpack-plugin
    • Hot Module Replacement:(HMR)也是webpack里很有用的一個(gè)插件留晚,它允許你在修改組件代碼后,自動(dòng)刷新實(shí)時(shí)預(yù)覽修改后的效果告嘲。

官方文檔
參考文章

webpack從入門到精通

git clone git@github.com:slashhuang/webpack2-tutorial.git
cd webpack2-tutorial
cnpm i --verbose //安裝所有依賴

安裝所有依賴.png

cnpm i -g anywhere
anywhere //隨時(shí)隨地將你的當(dāng)前目錄變成一個(gè)靜態(tài)文件服務(wù)器的根目錄
安裝anywhere.png

anywhere.png

command.js文件中的配置configFile.watch = true;

  • entry
webpack.config.js:
module.exports = {
  entry:{
      index:'./index.js',
    index1:'./index1.js'
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '_[name].js' 
  }
};
  • output:
webpack.config.js:
let base = {
      index:'./index.js?t=2',
      index1:'./index1.js'
};

//webpack2 提供了多種配置方案
module.exports = {
  entry:base,
  output: {
    //導(dǎo)出目錄
    path: path.resolve(__dirname, 'uuudist'),  // 必須是絕對(duì)路徑
    publicPath: "/output/uuudist/", // server-relative
    //包規(guī)范格式
    libraryTarget:'umd',
    library: "MyLibrary", 
    //文件名
    chunkFilename:'[chunkhash]_[name].js', //用來(lái)異步加載
    //hash位數(shù)
    hashDigestLength:3,
    //導(dǎo)出文件 
    //hash ==> webpack編譯過(guò)程
    // chunkhash => webpack對(duì)每個(gè)文件的hash
    filename: '_[name][chunkhash].js' //'_[name][chunkhash:3].js'
    //name是entry里面的key
  }
};

[chunkhash]類似時(shí)間戳错维,區(qū)分緩存文件 每一次文件內(nèi)容的改變都會(huì)使hash值改變,因此以這種方式命名文件無(wú)法去重橄唬,文件是增量的

  • devtool:
devtool: 'source-map',//資源映射表 chrome debug==>
or
devtool: 'cheap-source-map'
  • loaders:
 module:{
    //entry => loaders ==> webpack ==> output
    rules:[
            {
                test: /\.js[x]?$/,
                exclude: /node_modules/,
                use: {
                  loader:'babel-loader'
                }
            },
            {
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    use:{
                        loader:'css-loader',
                        options: {
                           sourceMap: true
                        }
                    }
                })
            },
            {
                test: /\.less$/,
                use: ExtractTextPlugin.extract({
                    fallback:'style-loader',
                    use:['css-loader',{
                        loader:'less-loader',
                        options: {
                           sourceMap: true
                        }
                    }]
                })
            },
            {
                test: /\.scss$/,
                use: ExtractTextPlugin.extract({
                    fallback:'style-loader',
                    use:['css-loader',{
                        loader:'sass-loader',
                        options: {
                           sourceMap: true
                        }
                    }]
                })
            },
            {
                test: /\.(png|jpg|jpeg|gif|woff|woff2|ttf|eot|svg|swf)$/,
                use: {
                    loader:'file-loader',
                    options:{
                        name:'[name]_[sha512:hash:base64:7].[ext]'
                    }
                }
            },
            {
                test: /\.html/,
                use:{
                    loader:"html-loader",
                    options:{
                        minimize: false,
                        attrs:false
                    }
                }
            }
    ]
}
  • output:
 plugins:[
            new webpack.ProvidePlugin({
                $: 'jquery'
            }),
            new WebpackNotifierPlugin({  //編譯成功會(huì)有提示
                title: 'Webpack 編譯成功',
                contentImage: path.resolve(process.cwd(), './img/avatar.jpeg'),
                alwaysNotify: true
            }),
            new ExtractTextPlugin({
                filename: "[name].css",
                disable: false,
                allChunks: true
            }),
            new webpack.optimize.CommonsChunkPlugin({
                name: 'common',
                minChunks: Infinity
            })
  ],
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赋焕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仰楚,更是在濱河造成了極大的恐慌隆判,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僧界,死亡現(xiàn)場(chǎng)離奇詭異侨嘀,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)捂襟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門咬腕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人葬荷,你說(shuō)我怎么就攤上這事涨共。” “怎么了宠漩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵举反,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我扒吁,道長(zhǎng)火鼻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任雕崩,我火速辦了婚禮魁索,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晨逝。我一直安慰自己蛾默,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布捉貌。 她就那樣靜靜地躺著支鸡,像睡著了一般冬念。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牧挣,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天急前,我揣著相機(jī)與錄音,去河邊找鬼瀑构。 笑死裆针,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寺晌。 我是一名探鬼主播世吨,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呻征!你這毒婦竟也來(lái)了耘婚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤陆赋,失蹤者是張志新(化名)和其女友劉穎沐祷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體攒岛,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赖临,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灾锯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兢榨。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挠进,靈堂內(nèi)的尸體忽然破棺而出色乾,到底是詐尸還是另有隱情誊册,我是刑警寧澤领突,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站案怯,受9級(jí)特大地震影響君旦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘲碱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一金砍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麦锯,春花似錦恕稠、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)千扶。三九已至,卻和暖如春骆捧,著一層夾襖步出監(jiān)牢的瞬間澎羞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工敛苇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妆绞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓枫攀,卻偏偏與公主長(zhǎng)得像括饶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子来涨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 文|晨妤兒 隨著社會(huì)的浮躁巷帝,女人也慢慢喜愛(ài)抽煙,愛(ài)抽煙的女人扫夜,都是熱情洋溢的女人楞泼,女人吸的不是香煙,是心中的空虛笤闯,...
    晨妤兒閱讀 1,005評(píng)論 4 10
  • 不知道相親是從什么時(shí)候開(kāi)始的颗味,不知道誰(shuí)開(kāi)啟了相親時(shí)代超陆,也不知道有多少人像我一樣沒(méi)完沒(méi)了的受著它的摧殘。 ...
    6cf510d9e2f8閱讀 780評(píng)論 0 0
  • 年終都是盛行盤點(diǎn)的浦马,單位的时呀,個(gè)人的,讓人目不暇接晶默,還有谨娜,焦頭爛額。 我的2017年磺陡,就像一場(chǎng)夢(mèng)趴梢,好像什么都沒(méi)有,是...
    鑫悅閣閱讀 184評(píng)論 0 1