1. 程式人生 > >東航電商前端技術周刊第四期20180629

東航電商前端技術周刊第四期20180629

brew amp 遠程 lse 速度 鍵值 選擇 快速排序 存取

1.Cookie相關知識

服務器端像客戶端發送Cookie是通過HTTP響應報文實現的,在Set-Cookie中設置需要像客戶端發送的cookie,cookie格式如下:
Set-Cookie: "name=value;domain=.domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;HttpOnly;secure"
其中name=value是必選項,其它都是可選項。Cookie的主要構成如下:
name:一個唯一確定的cookie名稱。通常來講cookie的名稱是不區分大小寫的。
value:存儲在cookie中的字符串值。最好為cookie的name和value進行url編碼
domain:domain對於哪個域是有效的。所有向該域發送的請求中都會包含這個cookie信息。這個值可以包含子域(如: yq.aliyun.com),也可以不包含它(如:.aliyun.com,則對於aliyun.com的所有子域都有效).
path: 表示這個cookie影響到的路徑,瀏覽器跟會根據這項配置,像指定域中匹配的路徑發送cookie。
expires:失效時間,表示cookie何時應該被刪除的時間戳(也就是,何時應該停止向服務器發送這個cookie)。如果不設置這個時間戳,瀏覽器會在頁面關閉時即將刪除所有cookie;不過也可以自己設置刪除時間。這個值是GMT時間格式,如果客戶端和服務器端時間不一致,使用expires就會存在偏差。
max-age: 與expires作用相同,用來告訴瀏覽器此cookie多久過期(單位是秒),而不是一個固定的時間點。正常情況下,max-age的優先級高於expires。
HttpOnly: 告知瀏覽器不允許通過腳本document.cookie去更改這個值,同樣這個值在document.cookie中也不可見。但在http請求張仍然會攜帶這個cookie。註意這個值雖然在腳本中不可獲取,但仍然在瀏覽器安裝目錄中以文件形式存在。這項設置通常在服務器端設置。
secure: 安全標誌,指定後,只有在使用SSL鏈接時候才能發送到服務器,如果是http鏈接則不會傳遞該信息。就算設置了secure 屬性也並不代表他人不能看到你機器本地保存的 cookie 信息,所以不要把重要信息放cookie就對了服務器端設置
優點:極高的擴展性和可用性
1.可以解決HTTP無狀態的問題,與服務器進行交互,分擔了服務器存儲的負擔
2.通過良好的編程,控制保存在cookie中的session對象的大小。
3.通過加密和安全傳輸技術(SSL),減少cookie被破解的可能性。
4.只在cookie中存放不敏感數據,即使被盜也不會有重大損失。
5.控制cookie的生命期,使之不會永遠有效。偷盜者很可能拿到一個過期的cookie。
缺點:
1.Cookie

數量和長度的限制。每個domain最多只能有20條cookie,每個cookie長度不能超過4KB,否則會被截掉。
2.安全性問題。如果cookie被人攔截了,那人就可以取得所有的session信息。即使加密也與事無補,因為攔截者並不需要知道cookie的意義,他只要原樣轉發cookie就可以達到目的了。
3.有些狀態不可能保存在客戶端。例如,為了防止重復提交表單,我們需要在服務器端保存一個計數器。如果我們把這個計數器保存在客戶端,那麽它起不到任何作用。
4.浪費帶寬,每次請求新頁面,cookie都會被發送過去
5.在cookie相關文檔信息中,提到cookie是不能跨域訪問的,但是在二級域名是可以共享cookie的。這樣就是我們的項目有了局限性,必須將多個系統的域名統一,作為二級域名,統一平臺提供使用主域名。這樣就可以實現cookie的單點登錄了。
一級域名相同,只是二級域名不同的情況下,瀏覽器允許通過設置document.domain共享Cookie。也就是說,Cookie只能跨二級域名來訪問,不能跨一級域名來訪問。

感謝李楠老師熱情分享

2.解析機上WiFi項目pc端src/js/common/index.js中的getTempGather方法

源碼:

function getTempGather() {
    return {
    zh: {
      headerTemp
    },
    en: {
      headerTemp: headerENTemp
    }
  }[window.storeCache.isENSite ? ‘en‘ : ‘zh‘];
}

解析:正常寫的,可能會如下寫

function getTempGather() {
    if(window.storeCache.isENSite){
         return {
             headerTemp: headerENTemp
        }
    }
    else{
        return {
              headerTemp
        }
    }
}

然後對比一下兩種寫法,哪種更好?顯然第二種if/else可讀性差,字符比第一種多了12個。而第一種對象鍵值與表達式得到了完美的運用,簡潔可讀,基本功紮實體現在這塊代碼裏。

感謝孫愛祥老師熱情分享

3.前端常用算法比較測試

冒泡排序、選擇排序、插入排序、快速排序執行速度對比

//冒泡排序,遍歷,一趟循環後將數組中最大項移至數組尾部,排除此最大項再對剩余項做循環操作
function bubbleSort(array){
    var arr = array.slice(0);
    console.time(‘bubbleSort‘);
    var i = arr.length;
    for(; i > 1; i--) {
        for (var j = 0; j < i; j++) {
            if(arr[j] > arr[ j + 1 ]){
                var temp = arr[j];
                arr[j] = arr[ j + 1 ];
                arr[ j + 1 ] = temp;
            }
        }
    }
    console.timeEnd(‘bubbleSort‘);
    return arr;
}

//#改進冒泡排序在一趟排序結束時發現未有任何交換位置,說明已經有序,無須再進行下趟循環
function advbubbleSort(array) {
    var arr = array.slice(0);
    console.time(‘advbubbleSort‘);
    var i = arr.length, exchange;
    for(; i > 1; i--){
        exchange = false;
        for(var j = 0; j < i; j++){
            if(arr[j] > arr[ j + 1 ]){
                exchange = true;
                var temp = arr[j];
                arr[j] = arr[ j + 1 ];
                arr[ j + 1 ] = temp;
            }
        }
        if (!exchange) {
            console.timeEnd(‘advbubbleSort‘);
            return arr;
        }
    }
    console.timeEnd(‘advbubbleSort‘);
    return arr;
}

    //#選擇排序將數組第n個元素暫存,再與剩余的數據比較將最小的指放入暫存並重復,不必在內循環中讀寫數組,比冒泡算法提高了執行效率
    function selectSort(array){
        var arr = array.slice(0);
        console.time(‘selectSort‘);
        var i = 0, len = arr.length,  min;
        for(; i < len - 1; i++){
            min = i;
            for(var j = i + 1; j < len ; j++){
                if(arr[j] < arr[min]){
                    min = j;
                }
            }
            if(min != i) {
                var temp = arr[i];
                arr[i] = arr[min];
                arr[min] = temp;
            }
        }
        console.timeEnd(‘selectSort‘);
        return arr;
    }

    //插入排序很好理解,就像打撲克,抓起一張牌插入隊列,右邊的牌順序向右移動
    function  insertSort(array) {
        var arr = array.slice(0);
        console.time(‘insertSort‘);
        var temp, i = 1, len = arr.length;
        for(; i < len; i++){
            temp = arr[i];
            var j = i;
            while ( j > 0 && arr[j-1] > temp){
                arr[j] = arr[j-1];
                j--;
            }
            arr[j] = temp;
        }
        console.timeEnd(‘insertSort‘);
        return arr;
    }

    //快速排序,選擇一個元素作為基準值(pivot)。將小於基準值的元素和大於基準值的元素分開保存      
    function  qSort(array) {
        var arr = array.slice(0);
        return (function () {
            console.time(‘qSort‘);
            var quickSort = function(ar){
                if(ar.length == 0){
                    return ar;
                }
                var left = [],
                    right = [],
                    start = ar[0],
                    len = ar.length;
                for(var i = 1; i < len; i++){
                    if(ar[i] < start){
                        left.push(ar[i]);
                    }else{
                        right.push(ar[i]);
                    }
                }
                return quickSort(left).concat(start, quickSort(right));
            }
            var result = quickSort(arr);
            console.timeEnd(‘qSort‘);
            return result;
        }());
    }


    //生成隨機數組
    function getArray(len){
        var i = 0, rArray = [len];
        for(; i < len; i++ ){
            rArray[i] = Math.floor(Math.random() * len );
        }
        return rArray;
    }
    //轉字符串
    function arrayToString(arr){
        var resString = arr.join(‘ ‘);
        return resString.replace(/(\d+\s){10}/g, ‘$&\n‘);;
    }

    //開始測試
    var testArray = getArray(50000);
    var inA = insertSort(testArray);
    var selA = selectSort(testArray);
    var bubA = bubbleSort(testArray);
    var qA = qSort(testArray);
    console.time(‘JSNativeSort‘);
    testArray.sort();
    console.timeEnd(‘JSNativeSort‘);

5萬條數據在Chrome瀏覽器中測試結果如下

insertSort: 715.124ms
selectSort: 1312.504ms
bubbleSort: 12704.735ms
qSort: 89.784ms
JSNativeSort: 27.051ms

4.開始使用Yarn管理依賴

Yarn是一個快速高效的依賴管理工具。
裝Yarn 緩存了每個下載過的包,所以再次使用時無需重復下載。 同時利用並行下載以最大化資源利用率,因此安裝速度更快。

那麽,是時候拋棄npm緩慢的進度條了,看下效果:

ymk:mbr-scaffold Halley$ yarn add sass
yarn add v1.7.0
[1/4] ??  Resolving packages...
[2/4] ??  Fetching packages...
[3/4] ??  Linking dependencies...
warning " > [email protected]" has unmet peer dependency "prettier@>= 0.11.0".
[4/4] ??  Building fresh packages...
success Saved 1 new dependency.
info Direct dependencies
└─ [email protected]
info All dependencies
└─ [email protected]
?  Done in 5.17s.

5.17s,sass安裝完成

安裝Yarn

使用Homebrew安裝Yanr安裝非常簡單

brew update
brew install yarn

初始化項目

yarn init

添加依賴包

yarn add [package]
yarn add [package]@[version]

更新依賴包

yarn upgrade [package]
yarn upgrade [package]@[version]

刪除依賴包

yarn remove [package]

5.常用git命令

git log --pretty=oneline 顯示提交日誌,完整版本號

git reflog 查看命令歷史

git reset --hard HEAD^ 回到上一版本

git reset --hard cb926e7e 回到某一個版本

git add 加入暫存取

git commit 提交到當前分支

git checkout -- file 丟棄工作區修改

git reset HEAD file 撤銷暫存區

git rm file 刪除文件

git remote prune origin 遠程分支刪除後同步本地

東航電商前端技術周刊第四期20180629