前端踩坑系列《四》

Top 3 頁面重排

問題描述
關(guān)于性能歧斟,確實是一個前端程序員應(yīng)該特別注意的問題纯丸,我這個問題其實算是冰山一角。平時我們在使用動畫的時候静袖,可能經(jīng)常使用 transition 做動畫觉鼻,但是如果動畫的動作會使觸發(fā)重繪和重排的話就要特別注意了。比如一個頁面中占位元素的高度在動畫過程改變的話队橙,那么頁面就會在動畫的過程中不斷的重排坠陈,會造成頁面的卡頓,效果很不好喘帚。

問題解決以及反思
盡量不要改變頁面中占位元素的寬高等會導(dǎo)致頁面重排的屬性畅姊。
transition 最好配合 transform 使用,而不要改變 height吹由、margin-top 等屬性若未,這個值得好好深究,這里不展開倾鲫。

Top 2 webpack importLoaders

問題描述
背景:使用 mpvue 將同一份代碼打包成 H5 端和小程序端代碼粗合,為了解決字體大小設(shè)置統(tǒng)一的問題,我們在 webpack 中使用了 px2rpx-loader(這個的使用有點類似于 px2rem-loader

在使用的時候乌昔,發(fā)現(xiàn)使用 import css 文件的時候不支持隙疚,打包到小程序端有問題。類似的寫法如下:

@import "../../../src/components/modal.css";

問題解決
CSS-loader 后面加上參數(shù) ?importLoaders=10磕道,這個參數(shù)的作用官方的解釋如下:

The option importLoaders allows you to configure how many loaders before css-loader should be applied to @imported resources.

可以看到供屉,importLoaders 定義的是使用多少個后面的 loader 去處理 @import 進來的資源。

看看官網(wǎng)的例子:

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              // 0 個的時候沒有,1個的時候使用 postcss-loader,2個使用 postcss-loader, sass-loader
              importLoaders: 2, // 0 => no loaders (default); 1 => postcss-loader; 2 => postcss-loader, sass-loader
            },
          },
          'postcss-loader',
          'sass-loader',
        ],
      },
    ],
  },
};

一開始我只使用了一個伶丐,發(fā)現(xiàn)并沒有滿足悼做,后來指定了多個,成功了哗魂!

Top 1 0.1 + 02 不等于 0.3

問題描述
對于前端而言肛走,下面的結(jié)論應(yīng)該都應(yīng)該知道

為什么會有這么情況?
先來看看十進制的小數(shù)是怎么轉(zhuǎn)換成二進制的录别,有個小小的結(jié)論:
十進制小數(shù)轉(zhuǎn)二進制方法:乘2除整
按照這個結(jié)論朽色,我們看下:

0.1 * 2 = 0.2 # 0
0.2 * 2 = 0.4 # 0
0.4 * 2 = 0.8 # 0
0.8 * 2 = 1.6 # 1
0.6 * 2 = 1.2 # 1
0.2 * 2 = 0.4 # 0
.....

好的,死循環(huán)了组题。也就是最后是 0.0001100011.....然而我們計算機的內(nèi)存是有限的葫男,所以我們必須要在某個精度上直接舍棄,這樣就會造成我們的 0.1 不是 0.1 了往踢,可能在底層就直接變成了 0.00011001100110011001100110011001100110011001100110011010腾誉。回到我們的問題峻呕,0.1 + 0.2 就變成了以下:

// 0.1 和 0.2 都轉(zhuǎn)化成二進制后再進行運算
0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.0100110011001100110011001100110011001100110011001100111

// 轉(zhuǎn)成十進制正好是 0.30000000000000004

解決方法
解決一:先乘后除

這個的原理利用在 javascript 中整型沒有這種精度問題的原理利职,但是這樣就會有個精度的要求,看了一個運營人員的配置瘦癌,后面好多個 0 的都有猪贪,也就是我也要相應(yīng)的乘以好大的值,我選擇 go die

解法二:toFixed 方法
解法三: toPrecision 方法
兩者有一定的相似讯私,就放在一起說热押。我們先來看看它們的用法
看了一下
toFixed
numObj.toFixed(digits)
digits 指的是小數(shù)點后數(shù)字的個數(shù),比如:

1.0043.toFixed(2); // 1.00
1.0053.toFixed(2); // 1.01

具體可以看 MDN toFixed()

toPrecision
numObj.toPrecision(precision)
precision 指的是有效數(shù)個數(shù)的整數(shù)斤寇,也就是從第一個非 0 數(shù)值開始數(shù)的個數(shù)桶癣。舉個例子:

0.041234123.toPrecision(2); // 0.041

具體可以看 MDN toPrecision

值得注意的點是上面兩個方法返回值都是字符串,也就是我們還需要轉(zhuǎn)換成小數(shù)娘锁⊙滥基于以上,我們可以得出以下的解決方法:

parseFloat(1.4000000000000001.toPrecision(12)) === 1.4  // True

封裝成方法:

function strip(num, precision = 12) {
  return +parseFloat(num.toPrecision(precision));
}

據(jù)說精度設(shè)置成 12 可以解決大部分的情況莫秆,如果你還想更精確间雀,用解法四吧!

解法四
Math.js镊屎、BigDecimal.js ...

結(jié)束語

踩坑的一周又結(jié)束了惹挟,祝大家心明眼亮,周末愉快~

?歷史文章:
前端踩坑系列《一》
前端踩坑系列《二》
前端踩坑系列《三》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缝驳,一起剝皮案震驚了整個濱河市连锯,隨后出現(xiàn)的幾起案子归苍,更是在濱河造成了極大的恐慌,老刑警劉巖运怖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霜医,死亡現(xiàn)場離奇詭異,居然都是意外死亡驳规,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門署海,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吗购,“玉大人,你說我怎么就攤上這事砸狞∧砻悖” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵刀森,是天一觀的道長踱启。 經(jīng)常有香客問我,道長研底,這世上最難降的妖魔是什么埠偿? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮榜晦,結(jié)果婚禮上冠蒋,老公的妹妹穿的比我還像新娘。我一直安慰自己乾胶,他們只是感情好抖剿,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著识窿,像睡著了一般斩郎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喻频,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天缩宜,我揣著相機與錄音,去河邊找鬼半抱。 笑死脓恕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窿侈。 我是一名探鬼主播炼幔,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼史简!你這毒婦竟也來了乃秀?” 一聲冷哼從身側(cè)響起肛著,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跺讯,沒想到半個月后枢贿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡刀脏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年局荚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愈污。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡耀态,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出暂雹,到底是詐尸還是另有隱情首装,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布杭跪,位于F島的核電站仙逻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涧尿。R本人自食惡果不足惜系奉,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姑廉。 院中可真熱鬧喜最,春花似錦、人聲如沸庄蹋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽限书。三九已至虫蝶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倦西,已是汗流浹背能真。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扰柠,地道東北人粉铐。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像卤档,于是被迫代替她去往敵國和親蝙泼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

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

  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,124評論 0 21
  • ??引用類型的值(對象)是引用類型的一個實例织鲸。 ??在 ECMAscript 中,引用類型是一種數(shù)據(jù)結(jié)構(gòu)溪胶,用于將數(shù)...
    霜天曉閱讀 1,052評論 0 1
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案搂擦? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,751評論 1 92
  • 圍繞前端的性能多如牛毛,涉及到方方面面哗脖,以我我們將圍繞PC瀏覽器和移動端瀏覽器的優(yōu)化策略進行羅列注意瀑踢,是羅列不是展...
    流動碼文閱讀 676評論 0 0
  • 一路風(fēng)塵,將柔軟深藏 被煙火裹挾才避,踽踽獨行 把笑臉展示丘损,在每個日升月落 細(xì)數(shù)傷疤,鐫刻成風(fēng)雪中的模樣 千山萬水的風(fēng)...
    寥落星辰兔閱讀 456評論 0 0