Webpack 使用指南

一最住、安裝

webpack 是一個(gè)模塊開(kāi)發(fā)工具。它的主要目標(biāo)是將 JavaScript 文件打包在一起怠惶,打包后的文件用于在瀏覽器中使用涨缚,但它也能夠勝任轉(zhuǎn)換 (transform)、打包(bundle)或包裹(package)任何資源(resource or asset)策治。webpack 就兩個(gè)作用一個(gè)打包作用脓魏,一個(gè)用于翻譯作用。

webpack是 nodejs 的工作流工具通惫,首先進(jìn)行安裝:
cnpm install -g webpack webpack-cli

cli 是英語(yǔ) commond line interface 命令行接口的意思茂翔。
webpack 和其插件 webpack-cli

安裝完畢之后,查看版本號(hào):
4.35.2

二履腋、基本使用

我們的項(xiàng)目很簡(jiǎn)單珊燎,沒(méi)有任何的第三方庫(kù),沒(méi)有sea.js遵湖、沒(méi)有require.js悔政。寫法幾乎和 node.js 寫法沒(méi)什么區(qū)別。

程序也很簡(jiǎn)單延旧,所有的js文件都在裸奔CMD規(guī)范谋国,沒(méi)有任何的標(biāo)準(zhǔn)殼:

//circle.js
    function mianji(a,b){
        return a * b ;
    }
    exports.mianji = mianji;
//main.js
    const c = require("./circle");
    alert(c.mianji(10,10)) ;

瀏覽器不支持、不兼容任何的require迁沫、exports單詞芦瘾。所以直接運(yùn)行瀏覽器報(bào)錯(cuò)捌蚊。使用webpack可以輕松解決這個(gè)事情!

這時(shí)我們?cè)贑MD窗口中執(zhí)行:
webpack main.js -o ./dist/all.js

o是output輸出的意思近弟。
把main.js 和里面的引報(bào)包合并到 dist 文件目錄下all.js (沒(méi)有文件目錄自動(dòng)創(chuàng)建)

合并的 all.js 
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){const r=n(1);alert(r.mianji(10,10))},function(e,t){t.mianji=function(e,t){return e*t}}]);

可以看到代碼前部分算是CMD規(guī)范的定義缅糟,最后幾句給我們寫的代碼加上了標(biāo)準(zhǔn)殼。

//index.html
<script src="js/dst/all.js"></script>

為什么說(shuō)webapck是智能打包藐吮、智能合并溺拱?

  • webpack不是無(wú)腦合并js文件!和我們今后要學(xué)習(xí)的Grunt谣辞、Gulp不同迫摔;
  • webpack是按圖索驥的,只有require鏈中出現(xiàn)的js文件泥从,才會(huì)被打包到all.js文件中句占!
  • 如果多個(gè)文件都require了某文件,這個(gè)文件只會(huì)在all.js中出現(xiàn)一次躯嫉。
三纱烘、 webpack.config.js 文件

很明顯,每次直接輸入是非常狼狽的祈餐。

webpack提供了一個(gè)文件可以配置它擂啥,指導(dǎo)webpack工作。這個(gè)文件的名字叫做webpack.config.js帆阳。名字必須是這個(gè)哺壶,必須放在項(xiàng)目的根目錄

這個(gè)文件模式背誦:

var path = require("path");

//進(jìn)行配置的東西蜒谤,實(shí)際上是本文件的暴露項(xiàng)山宾,要寫module.exports
module.exports = {
     //配置模式,有兩個(gè)單詞可以選擇
    //development開(kāi)發(fā)模式鳍徽,代碼不會(huì)混淆资锰、壓縮;
    //production生產(chǎn)模式阶祭,項(xiàng)目上線的時(shí)候要使用的模式绷杜。
    mode: "development", 
    //配置入口文件
    entry : "./js/main.js" ,
    //配置產(chǎn)出文件
    output : {
        //產(chǎn)出文件文件夾
        path : path.resolve(__dirname , "dist") ,
        //產(chǎn)出文件的文件名
        filename : "all.js"
    },
    //實(shí)時(shí)監(jiān)測(cè)文件更新,一旦文件更新了濒募,就重新合并打包一份
    watch : true
}

寫完這個(gè)文件之后鞭盟,我們就能在項(xiàng)目的根目錄打開(kāi)CMD窗口,輸入簡(jiǎn)單的命令:
webpack
webpack就知道自己找入口文件了萨咳,自己合并到產(chǎn)出文件了,自己監(jiān)聽(tīng)文件的變化了疫稿。

更加自動(dòng)的方式培他,創(chuàng)建身份證鹃两。
npm init
在身份證中改變一下 scripts:

{
  "name": "my",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev" : "webpack"
  },
  "author": "",
  "license": "ISC"
}

今后起項(xiàng)目就可以:
npm run dev

三、 babel-loader
Use next generation JavaScript, today.

Babel是一個(gè)轉(zhuǎn)換編譯器舀凛,它能將 ES6 轉(zhuǎn)換成可以在瀏覽器中運(yùn)行的代碼俊扳。軟件的目的讓開(kāi)發(fā)者使用更新的語(yǔ)法,同時(shí)不用擔(dān)心瀏覽器的兼容問(wèn)題猛遍。

cnpm install babel-core@6 babel-loader@7
安裝的時(shí)候一定要注意馋记,babel 最新版本 8 代和 webpack4 有兼容問(wèn)題,只能指定老版本懊烤。

babel-core是babel的核心梯醒,babel-loader 是 webpack 插件。
通過(guò)看手冊(cè)腌紧,我們知道修改 webpack.config.js 文件:

module: {
        rules: [
            {
                test: /\.m?js$/,//匹配.mjs和.js結(jié)束的文件
                exclude: /(node_modules|bower_components)/,
                use: {
                loader: 'babel-loader',
                    options: {
                        presets: ['env']
                    }
                }
            }
        ]
    }

所謂的 preset 是什么意思呢茸习?preset表示預(yù)設(shè)置。表示可以把高級(jí)語(yǔ)言翻譯成低級(jí)語(yǔ)言例如 ES6 => ES5壁肋。
npm install --save babel-preset-env

依據(jù)下圖可發(fā)現(xiàn)我們?cè)谂渲玫臅r(shí)候号胚,會(huì)把 babel- 后面第一個(gè)值的作為屬性名,最后一個(gè)值作為屬性值浸遗。


插件添加方法

可以進(jìn)行項(xiàng)目啟動(dòng)
npm run dev
可以看見(jiàn) ES6 被翻譯成普通 JS語(yǔ)法猫胁。

為了讓babel能夠翻譯語(yǔ)法,我們必須安裝一個(gè)babel的插件跛锌,
babel-plugin-transform-object-rest-spread
安裝依賴:
cnpm install babel-plugin-transform-object-rest-spread
改變webpack.config.js文件:

module: {
        rules: [
            {
                test: /\.m?js$/,//匹配.mjs和.js結(jié)束的文件
                exclude: /(node_modules|bower_components)/,
                use: {
                loader: 'babel-loader',
                    options: {
                        presets: ['env'],
                        plugins: ["transform-object-rest-spread"]
                    }
                }
            }
        ]
    }

此時(shí)就可以npm run dev

const obj2 = {
    ...obj, 
}
四弃秆、ES6中的CMD語(yǔ)法

CMD語(yǔ)法是commonjs在2005年左右提出的語(yǔ)法,被nodejs全盤采納察净。
腦殘的 w3c 卻非得這樣定義:

ES6對(duì)應(yīng)CMD簡(jiǎn)單的對(duì)應(yīng)關(guān)系:
require變?yōu)榱薸mport
exports變?yōu)榱薳xport
module變?yōu)榱薲efault

控制臺(tái)輸入測(cè)試:



瀏覽器廠商對(duì)此很抗議驾茴,到今天2019年7月5日,沒(méi)有任何瀏覽器支持上述語(yǔ)法氢卡。

但是webpack支持锈至,webpack在沒(méi)有babel-loader的存在下,天生能夠識(shí)別import的導(dǎo)入語(yǔ)法译秦,從而進(jìn)行智能的文件合并峡捡。

  • 基本的暴露和引入
//circle.js
export const mianji = function (a,b){
    return a * b ;
}
//main.js
import {mianji} from "./circle.js";
var a = prompt("下午好,請(qǐng)輸入一個(gè)數(shù)");
var b = prompt("下午好筑悴,請(qǐng)輸入另一個(gè)數(shù)");

alert(mianji(a,b));

必須在export后面加上const或者let或者var们拙。大括號(hào)中的函數(shù)名字,必須嚴(yán)格和暴露的名字相同阁吝!

  • 命名空間
    如果兩個(gè)包中都有mianji函數(shù)砚婆,此時(shí)用import {mianji}就沖突了。
    就需要使用命名空間,必須使用import * as 名字 from ""這樣的語(yǔ)法:
import * as m from "./circle.js";
var a = prompt("下午好装盯,請(qǐng)輸入一個(gè)數(shù)");
var b = prompt("下午好坷虑,請(qǐng)輸入另一個(gè)數(shù)");

alert(m.mianji(a,b));//請(qǐng)注意這里的調(diào)用不同
  • 默認(rèn)暴露
    導(dǎo)入的時(shí)候,普通暴露加大括號(hào)埂奈,默認(rèn)暴露不加大括號(hào)迄损,中間用逗號(hào)隔開(kāi)。
//circle.js
export const mianji = function (a,b){
    return a * b ;
}
var m =6;
export default m;
//main.js
import m,{mianji} from "./circle.js";
var a = prompt("下午好账磺,請(qǐng)輸入一個(gè)數(shù)");
var b = prompt("下午好芹敌,請(qǐng)輸入另一個(gè)數(shù)");

alert(mianji(a,b));
alert(m);
五、less 變?yōu)?CSS

less-loader:https://www.npmjs.com/package/less-loader
CSS 樣式表是扁平化鏈?zhǔn)秸Z(yǔ)法垮抗。

less 讓樣式表更加立體化氏捞。

body{
    background:aquamarine;

    @c : orange; //變量
    h1{
        color : @c;
    }
}

但是瀏覽器識(shí)別不了此種語(yǔ)法,我們需要安裝less和 less-loader借宵、style-loader幌衣、css-loader 三個(gè)插件轉(zhuǎn)化一下。
打開(kāi) webpack.config.js

    //配置插件
    module: {
        rules: [
            {
                // 以less結(jié)尾的文件
                test: /\.less$/,
                use: [
                    {
                        loader: "style-loader"  // creates style nodes from JS strings
                    }, 
                    {
                        loader: "css-loader"        // translates CSS into CommonJS
                    }, 
                    {
                        loader: "less-loader"   // compiles Less to CSS
                    }
                ]
            }
        ]
    }

引入后import "./me.less";運(yùn)行 npm run dev 打開(kāi)網(wǎng)頁(yè)即生效壤玫。

手動(dòng)轉(zhuǎn)less文件豁护,未全局安裝的時(shí)候。在這里找到node_modules\.bin lessc
運(yùn)行 CMD 命令 lessc a.less b.css => a.less 就變成了 b.css

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欲间,一起剝皮案震驚了整個(gè)濱河市楚里,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猎贴,老刑警劉巖班缎,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異她渴,居然都是意外死亡达址,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門趁耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)沉唠,“玉大人,你說(shuō)我怎么就攤上這事苛败÷穑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵罢屈,是天一觀的道長(zhǎng)嘀韧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)缠捌,這世上最難降的妖魔是什么锄贷? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上谊却,老公的妹妹穿的比我還像新娘蹂随。我一直安慰自己,他們只是感情好因惭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著绩衷,像睡著了一般蹦魔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咳燕,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天勿决,我揣著相機(jī)與錄音,去河邊找鬼招盲。 笑死低缩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的曹货。 我是一名探鬼主播咆繁,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顶籽!你這毒婦竟也來(lái)了玩般?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤礼饱,失蹤者是張志新(化名)和其女友劉穎坏为,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體镊绪,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匀伏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝴韭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片够颠。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖万皿,靈堂內(nèi)的尸體忽然破棺而出摧找,到底是詐尸還是另有隱情,我是刑警寧澤牢硅,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布蹬耘,位于F島的核電站,受9級(jí)特大地震影響减余,放射性物質(zhì)發(fā)生泄漏综苔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望如筛。 院中可真熱鬧堡牡,春花似錦、人聲如沸杨刨。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妖胀。三九已至芥颈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赚抡,已是汗流浹背爬坑。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涂臣,地道東北人盾计。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像赁遗,于是被迫代替她去往敵國(guó)和親署辉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 新建一個(gè)項(xiàng)目 新建項(xiàng)目react-demo文件夾 首先安裝webpack 1.全局安裝webpacknpm ins...
    youngiyang_打碼少年閱讀 397評(píng)論 0 0
  • 寫在開(kāi)頭 先說(shuō)說(shuō)為什么要寫這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,297評(píng)論 4 31
  • 目錄第1章 webpack簡(jiǎn)介 11.1 webpack是什么岩四? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,739評(píng)論 0 1
  • Webpack學(xué)習(xí)總結(jié) 此文只是自己學(xué)習(xí)webpack的一些總結(jié)涨薪,方便自己查閱,閱讀不變炫乓,非常抱歉8斩帷! 下載安裝:...
    Lxs_597閱讀 952評(píng)論 0 0
  • 你是菌 所以才能尋到枯葉的脈 你是蝶 所以才能翩戲美麗的花 你是風(fēng) 所以才能撫起飄蕩的云 你是海 所以才能塑形優(yōu)雅...
    毋尋閱讀 337評(píng)論 1 6