前端踩坑系列《四》

Gping發表於2019-04-12

Top 3 頁面重排

問題描述 關於效能,確實是一個前端程式設計師應該特別注意的問題,我這個問題其實算是冰山一角。平時我們在使用動畫的時候,可能經常使用 transition 做動畫,但是如果動畫的動作會使觸發重繪和重排的話就要特別注意了。比如一個頁面中佔位元素的高度在動畫過程改變的話,那麼頁面就會在動畫的過程中不斷的重排,會造成頁面的卡頓,效果很不好。

問題解決以及反思 儘量不要改變頁面中佔位元素的寬高等會導致頁面重排的屬性。 transition 最好配合 transform 使用,而不要改變 height、margin-top 等屬性,這個值得好好深究,這裡不展開。

Top 2 webpack importLoaders

問題描述 背景:使用 mpvue 將同一份程式碼打包成 H5 端和小程式端程式碼,為了解決字型大小設定統一的問題,我們在 webpack 中使用了 px2rpx-loader(這個的使用有點類似於 px2rem-loader

在使用的時候,發現使用 import css 檔案的時候不支援,打包到小程式端有問題。類似的寫法如下:

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

問題解決CSS-loader 後面加上引數 ?importLoaders=10,這個引數的作用官方的解釋如下:

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

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

看看官網的例子:

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',
        ],
      },
    ],
  },
};
複製程式碼

一開始我只使用了一個,發現並沒有滿足,後來指定了多個,成功了!

Top 1 0.1 + 02 不等於 0.3

問題描述 對於前端而言,下面的結論應該都應該知道

前端踩坑系列《四》

為什麼會有這麼情況? 先來看看十進位制的小數是怎麼轉換成二進位制的,有個小小的結論: 十進位制小數轉二進位制方法:乘2除整 按照這個結論,我們看下:

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
.....
複製程式碼

好的,死迴圈了。也就是最後是 0.0001100011.....然而我們計算機的記憶體是有限的,所以我們必須要在某個精度上直接捨棄,這樣就會造成我們的 0.1 不是 0.1 了,可能在底層就直接變成了 0.00011001100110011001100110011001100110011001100110011010。回到我們的問題,0.1 + 0.2 就變成了以下:

// 0.1 和 0.2 都轉化成二進位制後再進行運算
0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.0100110011001100110011001100110011001100110011001100111

// 轉成十進位制正好是 0.30000000000000004
複製程式碼

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

前端踩坑系列《四》

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

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

1.0043.toFixed(2); // 1.00
1.0053.toFixed(2); // 1.01
複製程式碼

具體可以看 MDN toFixed()

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

0.041234123.toPrecision(2); // 0.041
複製程式碼

具體可以看 MDN toPrecision

值得注意的點是上面兩個方法返回值都是字串,也就是我們還需要轉換成小數。基於以上,我們可以得出以下的解決方法:

parseFloat(1.4000000000000001.toPrecision(12)) === 1.4  // True
複製程式碼

封裝成方法:

function strip(num, precision = 12) {
  return +parseFloat(num.toPrecision(precision));
}
複製程式碼

據說精度設定成 12 可以解決大部分的情況,如果你還想更精確,用解法四吧!

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

結束語

踩坑的一週又結束了,祝大家心明眼亮,週末愉快~

​歷史文章:

前端踩坑系列《一》

前端踩坑系列《二》

前端踩坑系列《三》

相關文章