使用webpack+ts做一個貪吃蛇游戲(二)---webpack編譯的兼容性處理(babel和postcss)

一覆劈、babel
babel可以將高版本的js代碼轉(zhuǎn)換為低版本的js代碼,從而達到兼容舊瀏覽器(比如IE)的目的沛励。一些ES6的類和方法责语,比如Promisebabe會通過低版本js可以運行的方法重新實現(xiàn)目派,然后在代碼中使用坤候。

  1. 安裝babel
npm i -D @babel/core @/babel/preset-env babel-loader core-js

其中,@babel/corebabel的核心工具庫企蹭。
@babel/preset-envbabel的預(yù)置環(huán)境白筹,這個包里預(yù)置了很多環(huán)境,比如谷歌某版本谅摄、IE某版本徒河、火狐某版本等,設(shè)置了什么版本送漠,babel編譯的時候就相應(yīng)的編譯成什么樣的js顽照。
babel-loaderbabelwebpack中的加載器,用來將babelwebpack關(guān)聯(lián)起來闽寡。
core-js是模擬js運行環(huán)境的代碼代兵,提供了es5、es6polyfills爷狈,包括promises植影、symbols、collections涎永、iterators思币、typed arrays、ECMAScript 7+ proposals羡微、setImmediate等等支救。core-js里面東西很多,在實際配置的時候拷淘,會按需選擇一部分使用各墨。

2.如何使用

// webpack.config.js
// 首先在rules里加上babel對ts文件的處理
{
                // test指定的是規(guī)則生效的文件
                test: /\.ts$/,
                // 要使用的loader
                use: [
                    // 配置babel
                    {
                        loader: 'babel-loader',
                        options: {
                            // 設(shè)置預(yù)置環(huán)境
                            presets: [
                                [
                                    // 指定環(huán)境的插件
                                    "@babel/preset-env",
                                    // 配置信息
                                    {
                                        // 要兼容的瀏覽器版本
                                        targets: {
                                            "chrome": "58",
                                            "ie": "11"
                                        },
                                        // 指定corejs的版本
                                        "corejs": "3",
                                        // 使用corejs的方式 usage表示按需加載
                                        "useBuiltIns": "usage"
                                    }
                                ]
                            ]
                        }
                    },
                    'ts-loader'
                ],
                // 要排除的文件
                exclude: /node_modules/
                // 這塊配置的意思是,使用ts-loader處理所有以.ts結(jié)尾的文件启涯,但排除掉node_modules文件夾
            }

我們修改了對ts文件的處理規(guī)則贬堵,之前只用到ts-loader恃轩,這次加上了babel-loader,當(dāng)use屬性中有多個loader的時候黎做,可以通過數(shù)組的方式傳入叉跛,loader如果沒有特殊配置,寫入名字即可蒸殿,比如上面的ts-loader筷厘。如果有更詳細的配置,可以傳入一個對象宏所,比如上面的babel-loader酥艳。

需要注意的是:use中配置的loader是按照從后往前的順序執(zhí)行的,在上面配置中爬骤,首先通過ts-loaderts轉(zhuǎn)為jsjs版本由tsconfig.json指定)充石,然后通過babeljs轉(zhuǎn)換為可兼容的js代碼。

  1. 測試
// index.ts
const fn = (a:number, b:number) => a + b
fn(123, 456)

npm run build編譯后霞玄,打開bundle.js

編譯后的文件

可以看到骤铃,const被轉(zhuǎn)成了var,箭頭函數(shù)被轉(zhuǎn)成了普通函數(shù)坷剧,通過babel惰爬,將ts轉(zhuǎn)換的es6版本的js轉(zhuǎn)成了ie可以兼容的es5的js代碼。

在引入es6的Promise試試

// index.ts
const fn = (a:number, b:number) => a + b
fn(123, 456)
console.log(Promise)

編譯后的文件大了很多惫企,里面自己實現(xiàn)了promise

  1. bug
    到這里补鼻,我們得到的bundle.js按理說應(yīng)該可以支持到IE瀏覽器了,但實際卻發(fā)現(xiàn)報錯了
    執(zhí)行npm run start啟動項目雅任,在IE瀏覽器中打開风范,打開控制臺,發(fā)現(xiàn)報錯了沪么。
    IE瀏覽器報錯

    定位到錯誤的位置看看
    報錯位置

    我們發(fā)現(xiàn)webpack打包的js硼婿,包裹在一個立即執(zhí)行函數(shù)中,而這個函數(shù)里面禽车,是一個箭頭函數(shù)寇漫。IE不支持箭頭函數(shù),所以在最開始就報錯了殉摔。
    這里有點疑問州胳,我們不是用babeljs給轉(zhuǎn)成舊版本js了嗎,上面的例子中逸月,箭頭函數(shù)也被轉(zhuǎn)成普通函數(shù)了栓撞,這里為什么會有一個箭頭函數(shù)呢?

實際上,這里的箭頭函數(shù)瓤湘,是webpack的代碼瓢颅,而babel處理的是我們自己寫的代碼,所以它處理不到這塊弛说⊥炫常可以看出webpack并不喜歡IE,默認不想支持它木人。所以應(yīng)該怎么解決呢信柿?

webpack配置的output對象中,增加一個配置醒第,告訴webpack不要使用箭頭函數(shù)以及const(不設(shè)置這個渔嚷,在IE10瀏覽器中會因為const而報錯)。

output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js',
        // 告訴webpack不使用箭頭函數(shù)和const
        environment: {
            arrowFunction: false淘讥,
            const: false
        }
    }

在啟動下用IE打開圃伶,發(fā)現(xiàn)沒有報錯了堤如。
以上蒲列,關(guān)于babel的配置就告一段落了。
二搀罢、postcss

  1. 安裝
npm i -D less less-loader css-loader style-loader

less-loaderless的加載器蝗岖。
css-loader是用來進行css的模塊化處理的。如果在JS中導(dǎo)入了css榔至,那么就需要使用css-loader來識別這個模塊抵赢,通過特定的語法規(guī)則進行轉(zhuǎn)換內(nèi)容最后導(dǎo)出,css-loader會處理import / require()以及 @import / url引入的內(nèi)容唧取。
style-loader是處理css的最終引用的铅鲤,它在前面的包整理好引用關(guān)系后,在編譯好的html中枫弟,通過js創(chuàng)建style標(biāo)簽邢享,里面包含了css樣式。

除了安裝這些淡诗,還要安裝postcss骇塘,postcss之于css,就像babel之于js韩容,它可以將css轉(zhuǎn)換為更具兼容性的寫法款违。

npm i -D postcss postcss-loader postcss-preset-env

整體捋一下這些包的使用順序:

  • less文件寫樣式
  • 編譯的時候webpack首先使用less-loader加載less文件,并將less代碼轉(zhuǎn)換成css代碼
  • 使用postcss-loader群凶,根據(jù)配置將css代碼轉(zhuǎn)成更具兼容性的css代碼
  • css-loader處理引用關(guān)系插爹,知道應(yīng)該在什么地方引入哪些css代碼
  • style-loader通過js創(chuàng)建style標(biāo)簽,根據(jù)前面的引用關(guān)系请梢,在合適的地方加入css代碼
  1. 如何使用
// webpack.config.js 在module --> rules中指定less文件的加載規(guī)則
// 設(shè)置less文件的處理
            {
                test: /\.less$/,
                use: [
                    "style-loader",
                    "css-loader",
                    // 引入postcss
                    {
                        loader: "postcss-loader",
                        options: {
                            postcssOptions: {
                                plugins: [
                                    [
                                        "postcss-preset-env",
                                        {
                                            browsers: 'last 2 versions'
                                        }
                                    ]
                                ]
                            }
                        }
                    },
                    "less-loader"
                ]
            }

配置方法和babel類似递惋,plugins中指定了postcss的預(yù)置環(huán)境柔滔,以及兼容性要求為支持每種瀏覽器的最新的兩個版本。

  1. 測試
    src中創(chuàng)建styles/index.less文件
body {
  background: red;
  display: flex;
}

index.ts中引用這個css
import './styles/index.less'
編譯后打開bundle.js萍虽,搜索flex

編譯后的bundle.js

可以看到display:flex;加上了前綴睛廊,說明postcss的配置生效了。

經(jīng)過兩節(jié)時間杉编,webpack的配置已經(jīng)告一段落超全,后面章節(jié)將逐步實現(xiàn)貪吃蛇的小游戲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邓馒,一起剝皮案震驚了整個濱河市嘶朱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌光酣,老刑警劉巖疏遏,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異救军,居然都是意外死亡财异,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門唱遭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戳寸,“玉大人,你說我怎么就攤上這事拷泽∫呷担” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵司致,是天一觀的道長拆吆。 經(jīng)常有香客問我,道長脂矫,這世上最難降的妖魔是什么枣耀? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮羹唠,結(jié)果婚禮上奕枢,老公的妹妹穿的比我還像新娘。我一直安慰自己佩微,他們只是感情好缝彬,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哺眯,像睡著了一般谷浅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天一疯,我揣著相機與錄音撼玄,去河邊找鬼。 笑死墩邀,一個胖子當(dāng)著我的面吹牛掌猛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眉睹,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荔茬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竹海?” 一聲冷哼從身側(cè)響起慕蔚,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斋配,沒想到半個月后孔飒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡艰争,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年坏瞄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片园细。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡惦积,死狀恐怖接校,靈堂內(nèi)的尸體忽然破棺而出猛频,到底是詐尸還是另有隱情,我是刑警寧澤蛛勉,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布鹿寻,位于F島的核電站,受9級特大地震影響诽凌,放射性物質(zhì)發(fā)生泄漏毡熏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一侣诵、第九天 我趴在偏房一處隱蔽的房頂上張望痢法。 院中可真熱鬧,春花似錦杜顺、人聲如沸财搁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尖奔。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間提茁,已是汗流浹背淹禾。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茴扁,地道東北人铃岔。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像峭火,于是被迫代替她去往敵國和親德撬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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