澳洲熱浪恐惡化野火危機 數千觀光客準備撤離

摘錄自2020年1月2日中央社雪梨報導

澳洲4日恐遭一波熱浪侵襲,預期會引發致命火災,數千名觀光客必須在不到48小時內撤離已被野火肆虐的沿海社區。

法新社報導,在2019年到2020年的跨年夜,災難性野火把澳洲大陸南岸燒出遍地火場,沿著海岸形成一條火帶,造成至少8人死亡,海邊小鎮被火焰包圍,度假遊客陷入困境。

澳洲新南威爾斯省(NSW)鄉村消防局公告「遊客禁停區」,從度假勝地巴特曼灣(Batemans Bay)沿著向來風景優美的東南海岸延伸約200公里,到相鄰的維多利亞省(Victoria),當局也呼籲這裡的人遠離火災威脅的地區。

當局告誡遊客在4日前離開,天氣預報預測這天會有狂風,氣溫將飆升到攝氏40度以上。

新南威爾斯省運輸部長康史坦士(Andrew Constance)接受澳洲廣播公司(ABC)訪問時說,這可能是這個地區「歷來最大規模的人員撤離」,數千人準備疏散,以避開4日可能的新一波惡火。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

次世代倫敦經典!紅色雙層公車改採比亞迪電動車系統

提到英國倫敦,不少人就會想起經典的紅色雙層公車。倫敦交通局為響應環保,宣布與比亞迪簽約,將部分紅色雙層公車打造為搭載電池的次世代電動公車,且即將開始在倫敦市展開服務。

在英國舉辦的第40屆清潔巴士高峰會(Clean Bus Summit)上,倫敦交通局與比亞迪聯合宣布了這項消息。倫敦市場Boris Johnson指出:「過去不少人都認為雙層公車因所需的電池體積問題而無法電動化,但比亞迪辦到了,領先全球。」從今年十月開始,比亞迪所生產的紅色雙層巴士將成為倫敦第16路公車所採用的車種。

比亞迪歐洲營運經理Isbrand Ho傳達公司與倫敦交通局的愉快合作,且表示希望還能把無汙染的電動公車推廣到更多國家、城市。比亞迪電動公車採用許多領先技術,包含12年保固的碳酸鋰鐵電池技術、專利的內輪引擎、反饋制動系統等。比亞迪電動公車具有壽命較長、環保無汙染、安靜、平穩等優點,每次充電後可在市區內行駛約155英里。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

數據結構之Array、ArrayList、List、LinkedList對比分析

一、前言:

  在c#數據結構中,集合的應用非常廣泛,無論是做BS架構還是CS架構開發,都離不開集合的使用,比如我們常見的集合包括:Array、ArrayList、List、LinkedList等。這一些數據集合,在功能上都能夠實現集合的存取,但是他們內部有什麼區別,在使用時需要注意一些什麼呢?下面根據個人的經驗,對這一些集合數據的使用做一個簡單的小結,如果說的不對的地方,歡迎指出,多多交流改進。

二、Array集合簡介

  Array集合,也就是數組,是最簡單的數據結構,其存儲的數據在內存空間是連續的,數組有一下一些特點

  • 1.數據存儲是連續的
  • 2.數組長度在定義時就必須制定
  • 3.數組存儲的數據類型都是同一類型
  • 4.數組可以直接通過小標訪問

  優缺點:
   優點:
  1、可以根據索引直接訪問,訪問速度快
   2、數據是安全的,由於數據類型一致性,在存儲使用過程中不涉及
  缺點:
  1、由於數據是連續存儲的,導致插入效率變慢
    2、由於數組長度大小固定,那麼對預期非固定長度的数字不好處理

  練習實例代碼:

 

    /// <summary>
    /// 數組練習操作 
    /// </summary>
    public class ArrayTest
    {
        /// 數組 Array 對於大家來說一點都不陌生
        /// 數組是在內存連續分配的存儲空間,這也導致數組有一下一些特點
        /// 1.數據存儲是連續的
        /// 2.數組長度在定義時就必須制定
        /// 3.數組存儲的數據類型都是同一類型
        /// 4.數組可以直接通過小標訪問
        /// 
        /// 優缺點:
        /// 優點:
        ///     1、可以根據索引直接訪問,訪問速度快
        ///     2、數據是安全的,由於數據類型一致性,在存儲使用過程中不涉及到裝箱拆箱操作
        /// 缺點:
        ///     1、由於數據是連續存儲的,導致插入效率變慢
        ///     2、由於數組長度大小固定,那麼對預期非固定長度的数字不好處理

        /// int類型的數組操作 
        public static void IntArrayTest()
        {

            //// 定義一個秒錶,執行獲取執行時間
            Stopwatch st = new Stopwatch();//實例化類
            st.Start();//開始計時

            Console.WriteLine("開始初始化長度為10000000的int數組:");

            //// 定義一個數組
            int[] nums = new int[10000000];
            for (int i = 0; i < 10000000; i++)
            {
                nums[i] = 1 + 1;
            }

            //需要統計時間的代碼段

            st.Stop();//終止計時
            Console.WriteLine(string.Format("初始化長度為10000的int數組完畢!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));
        }
    }

 

三、ArrayList集合簡介

ArrayList 是Array的升級版,能夠解決Array的一些缺點
ArrayList其內部實現也是Array,只是其長度是可以動態,在其內部用一個變量記錄控制長度,ArrayList有如下一些特點

  • 1.長度不固定
  • 2.可以存儲不同的數據類型(object)
  • 3.同樣支持索引查詢(可以直接通過小標訪問)
  • 4.靈活性更強,以犧牲性能為代價

優缺點:
優點:
1、長度不固定,在定義是不必擔長度溢出
2、可以存儲任意數據類型
3、可根據索引查詢,查詢效率快
缺點:
1、由於長度不固定,執行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數據,犧牲性能
2、由於存儲類型是object,所以在存數據時會有裝箱操作,在取數據時會有拆箱操作,影響效率
3、線程不安全,因為其內部實現是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程

使用技巧:
在實際使用過程中,為了避免自動擴容,可以預估數據長度,初始化一個數據長度,從而提高效率

練習實例代碼:

    /// <summary>
    /// ArrayList數組練習操作 
    /// </summary>
    public class ArrayListTest
    {
        /// ArrayList 是Array的升級版,能夠解決Array的一些缺點
        /// ArrayList其內部實現也是Array,只是其長度是可以動態,在其內部用一個變量記錄控制長度,ArrayList有如下一些特點
        /// 1.長度不固定
        /// 2.可以存儲不同的數據類型(object)
        /// 3.同樣支持索引查詢(可以直接通過小標訪問)
        /// 4.靈活性更強,以犧牲性能為代價

        /// 優缺點:
        /// 優點:
        ///     1、長度不固定,在定義是不必擔長度溢出
        ///     2、可以存儲任意數據類型
        ///     3、可根據索引查詢,查詢效率快
        /// 缺點:
        ///     1、由於長度不固定,執行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數據,犧牲性能
        ///     2、由於存儲類型是object,所以在存數據時會有裝箱操作,在取數據時會有拆箱操作,影響效率
        ///     3、線程不安全,因為其內部實現是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程
        ///     
        /// 使用技巧:
        ///     在實際使用過程中,為了避免自動擴容,可以預估數據長度,初始化一個數據長度,從而提高效率

        /// ArrayList操作實例
        public static void ArrayListOpert()
        {

            //// 定義一個秒錶,執行獲取執行時間
            Stopwatch st = new Stopwatch();//實例化類

            //// 需要統計時間的代碼段(統計初始化長度時的執行時間)
            st.Start();//開始計時
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("ArryList集合存儲數據量為10000000,初始化一個長度,執行開始:");

            ArrayList arrayList = new ArrayList(10000000);

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                arrayList.Add(1 + 1);
            }

            st.Stop();//終止計時
            Console.WriteLine(string.Format("ArryList集合存儲數據量為10000000,初始化一個長度,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));

            //// 需要統計時間的代碼段(統計初始化非指定長度時的執行時間)

            st.Restart();
            Console.WriteLine("");
            Console.WriteLine("ArryList集合存儲數據量為10000000,初始化不指定長度,執行開始:");

            arrayList = new ArrayList();

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                arrayList.Add(1 + 1);
            }

            st.Stop();//終止計時
            Console.WriteLine(string.Format("ArryList集合存儲數據量為10000000,初始化不指定長度,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));
        }
    }

 

四、List集合簡介

 

隨着c#泛型的推出,為了避免ArrayList一些缺點,微軟推出了List集合
List集合內部還是採用的Array實現,同時在定義時需要指定對應的數據類型
這樣級保留了Array集合的優點,同時也避免了ArrayList集合的數據類型不安全和裝箱帶來的性能犧牲
List特點:

  • 1、數據長度不固定,自動增加
  • 2、存儲相同的數據類型
  • 3、可根據索引查詢,查詢效率快

優缺點:
優點:
1、長度不固定,在定義是不必擔長度溢出
2、存儲相同數據類型的數據,避免的數據的裝箱拆箱,提高了數據處理效率
3、支持索引查詢,查詢效率快
缺點:
1、由於長度不固定,執行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數據,犧牲性能
2、線程不安全,因為其內部實現是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程

 

練習實例代碼:

   /// <summary>
    /// List練習操作
    /// </summary>
    public class ListTest
    {
        /// 隨着c#泛型的推出,為了避免ArrayList一些缺點,微軟推出了List集合
        /// List集合內部還是採用的Array實現,同時在定義時需要指定對應的數據類型
        /// 這樣級保留了Array集合的優點,同時也避免了ArrayList集合的數據類型不安全和裝箱帶來的性能犧牲
        /// List特點:
        /// 1、數據長度不固定,自動增加
        /// 2、存儲相同的數據類型
        /// 3、可根據索引查詢,查詢效率快
        /// 
        /// 優缺點:
        /// 優點:
        ///     1、長度不固定,在定義是不必擔長度溢出
        ///     2、存儲相同數據類型的數據,避免的數據的裝箱拆箱,提高了數據處理效率
        ///     3、支持索引查詢,查詢效率快
        /// 缺點:
        ///     1、由於長度不固定,執行效率低下,因為超出默認長度(10)后,會自動擴容拷貝數據,犧牲性能
        ///     2、線程不安全,因為其內部實現是用size、array來共同控制,在新增操作時是非原子操作,所以非安全線程

        /// ArrayList操作實例
        public static void ListOpert()
        {
            //// 定義一個秒錶,執行獲取執行時間
            Stopwatch st = new Stopwatch();//實例化類
            st.Start();//開始計時
                       //// 需要統計時間的代碼段(統計初始化長度時的執行時間)
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("List集合存儲數據量為10000000,初始化一個長度,執行開始:");

            List<int> list = new List<int>(10000000);

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                list.Add(1 + 1);
            }

            //需要統計時間的代碼段

            st.Stop();//終止計時
            Console.WriteLine(string.Format("List集合存儲數據量為10000000,初始化一個長度,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));

            //// 需要統計時間的代碼段(統計初始化非指定長度時的執行時間)
            st.Restart();
            Console.WriteLine("");
            Console.WriteLine("List集合存儲數據量為10000000,初始化不指定長度,執行開始:");

            list = new List<int>();

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                list.Add(1 + 1);
            }

            st.Stop();//終止計時
            Console.WriteLine(string.Format("List集合存儲數據量為10000000,初始化不指定長度,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));
        }
    }

 

五、LinkedList集合簡介

LinkedList鏈表的底層是採用雙向鏈表的方式實現,
在鏈表(Linked List)中,每一個元素都指向下一個元素,以此來形成了一個鏈(chain)
可以從頭部和尾部插入數據,在存儲內存上採用非連續方式存儲,鏈表有如下一些特點

  • 1、內存存儲上是非連續的
  • 2、能夠支持從頭部和底部同時插入
  • 3、長度是非固定的

優缺點:
優點:
1、由於非連續存儲,中部插入和刪除元素效率高
2、長度非固定,在創建時不用考慮其長度
3、可以沖頭部和底部添加元素
4、數據類型是安全的,在創建時需要指定的數據類型
缺點:
1、由於非連續存儲,不能通過小標訪問,查詢效率低

練習實例代碼:

    /// <summary>
    /// LinkedList練習操作
    /// </summary>
    public class LinkedListTest {
        /// LinkedList鏈表的底層是採用雙向鏈表的方式實現,
        /// 在鏈表(Linked List)中,每一個元素都指向下一個元素,以此來形成了一個鏈(chain)
        /// 可以從頭部和尾部插入數據,在存儲內存上採用非連續方式存儲,鏈表有如下一些特點
        /// 1、內存存儲上是非連續的
        /// 2、能夠支持從頭部和底部同時插入
        /// 3、長度是非固定的
        /// 優缺點:
        /// 優點:
        ///     1、由於非連續存儲,中部插入和刪除元素效率高
        ///     2、長度非固定,在創建時不用考慮其長度
        ///     3、可以沖頭部和底部添加元素
        ///     4、數據類型是安全的,在創建時需要指定的數據類型
        ///  缺點:
        ///     1、由於非連續存儲,不能通過小標訪問,查詢效率低

        /// LinkedList操作實例
        public static void LinkedListTestOpert() {
            //// 定義一個秒錶,執行獲取執行時間
            Stopwatch st = new Stopwatch();//實例化類
            st.Start();//開始計時
                       //// 需要統計時間的代碼段(統計初始化長度時的執行時間)
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("Linked集合存儲數據量為10000000,執行開始:");

            LinkedList<int> list = new LinkedList<int>();

            //// 定義一個數組
            for (int i = 0; i < 10000000; i++)
            {
                list.AddFirst(1 + 1);
            }

            //需要統計時間的代碼段

            st.Stop();//終止計時
            Console.WriteLine(string.Format("Linked集合存儲數據量為10000000,執行完畢:!總耗時{0}毫秒", st.ElapsedMilliseconds.ToString()));
        }
    }

 

六、每種集合數據執行結果對比分析

 

    class Program
    {
        static void Main(string[] args)
        {
            //// array數組操作測試
            ArrayTest.IntArrayTest();

            //// arrayList集合操測試
            ArrayListTest.ArrayListOpert();

            //// List集合操作測試
            ListTest.ListOpert();

            //// LinkedList集合操作測試
            LinkedListTest.LinkedListTestOpert();

            ///// 通過測試數據
            //通過測試數據大概可以分析得出一些結論
            //1、整體效率上Array效率最高,ArrayList效率最低,List效率介於Array和ArrayList之間
            //2、ArrayList和List集合,在定義時如果知道數據長度,那麼初始化時,指定長度的效率比不指定的長度效率高
            
            
            //總結:
            //在數據集合使用選擇上給出以下一些建議:
            //1、Array:當元素的數量是固定的,並且需要使用下標時
            //2、ArrayList:當存儲的元素類型不同時
            //3、List:當元素的數量是固定的,並且需要使用下標時
            //4、LinkedList:當元素需要能夠在列表的兩端添加時
            Console.ReadLine();
        }
    }

  執行結果數據

 

通過測試數據大概可以分析得出一些結論
1、整體效率上Array效率最高,ArrayList效率最低,List效率介於Array和ArrayList之間
2、ArrayList和List集合,在定義時如果知道數據長度,那麼初始化時,指定長度的效率比不指定的長度效率高

七、總結:

在數據集合使用選擇上給出以下一些建議:
1、Array:當元素的數量是固定的,並且需要使用下標時
2、ArrayList:當存儲的元素類型不同時,初始化時給一個預估的長度
3、List:當元素的數量是固定的,並且需要使用下標時,初始化時給一個預估的長度
4、LinkedList:當元素需要能夠在列表的兩端添加時

附件:

 

關於這一些練習的代碼,上傳到github,有興趣的可以看一下:

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

柏克萊新制 業者供免洗杯需加收新台幣七元

摘錄自2020年1月6日公視報導

在美國加州的柏克萊1月起有新規定,餐飲業者如果提供「一次性」的免洗杯,每個要加收0.25美分、約新台幣七元的費用,來限制餐廳使用免洗杯。

非營利組織「請內用」發言人尼克說:「你知道許多飲料最貴的部分其實是杯子本身,而不是裡面的飲料?」

打算淘汰免洗杯的,還有知名連鎖店藍瓶咖啡,藍瓶咖啡過去每年要用掉1200萬個紙杯。藍瓶咖啡顧客崔西認為:「垃圾、浪費是重大議題,所以我很高興看到我最喜歡的咖啡店帶頭這麼做。」

奧克蘭北部的柏克萊更積極,當地新法規規定,1月開始,餐飲業者若提供「一次性」的免洗杯,每個要加收0.25美分、約新台幣7元的費用。

但行動不便者認為,沒有免洗杯很不方便,因為玻璃罐和陶瓷杯對他們來說太重了。看見身心障礙計畫創辦人艾莉絲表示:「你不可以有永續性卻沒有彈性,那樣就不叫永續性了。」身障朋友希望政策和店家保有彈性,讓需要的人,還是能使用紙杯,在環保和弱勢權益間取得平衡。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

環保署:6 年內補助蔬果運輸車全面汰換電動車

使用柴油的果菜市場傳統蔬果運輸車,會產生大量 PM2.5 細懸浮微粒及高分貝噪音,長期下來對人體恐造成傷害,環保署宣布,將在 6 年內將全國大型果菜市場,合計約 1,778 輛柴油拖板工具車,全面補助汰換為電動蔬果運輸車。   環署空保處長陳咸亨說,若以西螺果菜市場為例,電動蔬果運輸車與傳統柴油拖板車相較之下,雖然電池總使用成本每月約 5,840 至 6,460 元,較傳統柴油拖板車每月 4,000 至 6,100 元來得高,但在環保署的補助下,每個月成本將會降至 2,340 至 3,260 元。   空保處統計,目前包括台北第一果菜批發市場、三重果菜市場、宜蘭果菜市場、興建中的板橋果菜市場等市場皆有意願使用電動蔬果運輸車,環保署也將持續全面推動補助全國果菜市場,盼 6 年內全面汰換為電動蔬果運輸車。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

學習下ElasticSearch

ElasticSearch基礎概念

使用場景:比如分庫的情況下,你想統計所有數據的報表,就把所有數據都放在ElasticSearch上

關係型數據庫 ElasticSearch
數據庫Database 索引index,支持全文檢索
表Table 類型Type
數據行Row 文檔Document
數據列Column 字段Field
模式Schema 映射Mapping

用關係型數據庫就會想到建立一張User表,再建字段等,

而在Elasticsearch的文件存儲,Elasticsearch是面向文檔型數據庫,一條數據在這裏就是一個文檔,用JSON作為文檔序列化的格式

在ES6.0之後,已經不允許在一個index下建不同的Type了,一個index下只有一個Type(以後版本中Type概念會去掉,可以直接把index類比成Table)

節點Node:

  一個ElasticSearch運行的實列,集群構成的單元

集群Cluster:

  由一個或多個節點組成,對外提供服務  

Elasticsearch實現原理-倒排索引

ElasticSearch是基於倒排索引實現的

倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。

通俗地來講,正向索引是通過key找value,反向索引則是通過value找key。

倒排索引—單詞詞典

單詞詞典(Term Dictionary)是倒排索引的重要組成部分。

——記錄所有文檔的單詞,一般都比較大

——記錄單詞到倒排列表的關聯信息(這個單詞關聯了哪些文檔)

倒排索引—排序列表

倒排列表(Posting List)記錄了單詞對應文檔的集合,由倒排索引項(Posting)組成

倒排索引項(Posting)主要包含如下信息

—文檔Id,用於獲取原始信息

—單詞頻率(TF,Term Frequency),記錄該單詞在文檔中出現的次數,用於後序相關算分

—位置(Position),記錄單詞在文檔中的分詞位置,用於做詞語搜索(Phrase Query)

—偏移(Offset),記錄單詞在文檔的開始和結束位置,用於高亮显示

分詞

搜索引擎的核心是倒排索引,而倒排索引的基礎就是分詞。所謂分詞可以簡單理解為將一個完整的句子切割為一個個單詞的過程。也可以叫文本分析,在es稱為Analysis。

如文本:elasticSearch是最流行的搜索引擎

分詞結果:elasticSearch 流行 搜索引擎

分詞器是es中專門處理分詞的組件,英文為Analyzer,它的組成如下

Character Filters:針對原始文本特殊處理,比如除html特殊符

Tokenizer:將原始文本按照一定規則切分為單詞

TokenFilters:針對tokenizer處理的單詞就行在加工,比如轉小寫,刪除或新增處理(比如中文中的  這 呢 無實意的詞)

Analyze API

es提供了一個測試分詞的API接口,方便驗證分詞效果,endpoint是_analyze

—可以直接指定analyze測試

—可以直接指定索引中的字段進行測試

—可以自定義分詞器進行測試

文檔映射Mapping

Mapping類似數據庫中的表結構定義,主要作用如下:

—定義Index下的字段名(Field Name)

—定義字段的類型,比如數值型、字符串型、布爾型等

—定義倒排索引相關的配置,比如是否索引、記錄position等

Dynamic Mapping

es可以自動識別文檔字段類型,從而降低用戶使用成本

SearchAPI介紹和相關性算分

es中存儲的數據進行查詢分析,endpoint為_search

查詢主要有兩種形式

1)URI Search

操作簡單,方便通過命令進行測試

但 僅包含部分查詢語法

GET /indexname/_search?q=user:xx

2)Request Body Search

es提供的完備查詢語法Query DSL(Domain Specific Language)

GET /indexname/_search

{
  ”query”: {
    ”term”: {
      ”user”: “xx”
    }
  }
}

相關算分

相關算分是指文檔與查詢語句直接的相關度,英文為relevance

  通過倒排索引可以獲取與查詢語句相匹配的文檔列表,那麼如何將最符合用戶查詢的文檔放到前列呢

  本質是一個排序問題,排序的依據是相關算分

ES目前主要有兩個相關性算分模型

  TF/IDF模型

  BM25模型 5.x之後的默認模型

BM25相比TF/IDF的一大優化是降低了TF(Term Frequency單詞頻率)在過大時的權重

相關算分是shard與shard間是相互獨立的,也就意味着一個Term的IDF等值在不同shard上是不同的。文檔的相關算分和它所處的shard有關

在文檔數量不多時 會導致相關算分嚴重不準的情況發生

解決辦法

  —設置分片數是一個,從根本排除問題,在文檔數據量不多時可以考慮該方法,(百萬到千萬)

  —二是使用DFS Query Then Ftech查詢方式

Elasticsearch分佈式特性

es支持集群模式,是一個分佈式系統,好處是

—1)增加系統容量:內存、磁盤,使es集群可以支持PB級的數據

如何將數據分佈在所有節點上

  —引入分片 Shard解決問題

分片是ES支持PB級數據的基石

  —分片存儲了部分數據,可以分部在任意節點上

  —分片數在索引創建時指定且後序不允許再更改(即使你後面新增了也用不到),默認5個

  —分片有主分片和副本分片之分,以實現數據的高可用

es集群由多個es實列組成

  —不同集群通過集群名字來區分,可通過cluster.name修改,默認為elasticSearch

  —每個ES實列本質是一個JVM進程,且有自己的名字,通過node.name修改

Master Node:Master節點通過集群中所有的節點選舉產生,可以被選舉的節點稱為master-eligible節點,

      相關配置如下:node.master:true

Coordinating Node:處理請求的節點為Coordinating節點,該節點為所有節點默認角色,不能取消

            作用是把請求路由到正確的節點處理,比如創建索引請求到master節點

Data Node:存儲數據的節點即為data節點,默認節點都是data類型,相關配置如下:node.data.true

—2)提供系統可用性:即部分節點停止服務,整個集群依然可以正常服務

提高系統可用性

服務可用性

  —兩個節點情況下,允許其中一個節點停止服務  

數據可用性

  —引入副本(Replication)解決

  —每個節點上都有完備的數據

複製分片的意義在於容錯性,當一個節點掛了,另一個節點上的分片可以代替掛掉節點上的分片

故障轉移

一:

 二:

 三:

文檔到分片的映射算法

es通過如下公式計算文檔到對應的分片 -shard=hash(routing)%number_of_primary_shards

hash算法保證可以將數據均勻的分散在分片中

routing是一個關鍵參數,默認是文檔id,也可以自行指定

number_of_primary_shards是主片分數(該算法與主片分數相關,這也是分片數量一旦確定就不能修改的原因)

腦裂問題

在上述第一步的時候 node2和node3選舉node2為master節點了時候,此時會更新cluster state

此時node1節點網絡恢復了,node1自己組成集群后,也會更新cluster state

此時:同一個集群有兩個master,而且維護不同的cluster state,網絡恢復后 無法選擇正確的master

解決方案:僅在可選舉master-eligible節點數大於等於quorum時才可以進行master選舉

        即使node1節點恢復了 ,可選節點數未達到quorum,不選舉

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

008.Kubernetes二進制部署Nginx實現高可用

一 Nginx代理實現kube-apiserver高可用

1.1 Nginx實現高可用


基於 nginx 代理的 kube-apiserver 高可用方案。

控制節點的 kube-controller-manager、kube-scheduler 是多實例部署,所以只要有一個實例正常,就可以保證高可用;

集群內的 Pod 使用 K8S 服務域名 kubernetes 訪問 kube-apiserver, kube-dns 會自動解析出多個 kube-apiserver 節點的 IP,所以也是高可用的;

在每個節點起一個 nginx 進程,後端對接多個 apiserver 實例,nginx 對它們做健康檢查和負載均衡;

kubelet、kube-proxy、controller-manager、scheduler 通過本地的 nginx(監聽 127.0.0.1)訪問 kube-apiserver,從而實現 kube-apiserver 的高可用;

從而基於 nginx 4 層透明代理功能實現 K8S 節點( master 節點和 worker 節點)高可用訪問 kube-apiserver 。

1.2 下載編譯Nginx

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# wget http://nginx.org/download/nginx-1.15.3.tar.gz
  3 [root@k8smaster01 work]# tar -xzvf nginx-1.15.3.tar.gz
  4 [root@k8smaster01 ~]# cd /opt/k8s/work/nginx-1.15.3/
  5 [root@k8smaster01 nginx-1.15.3]# mkdir nginx-prefix
  6 [root@k8smaster01 nginx-1.15.3]# ./configure --with-stream --without-http --prefix=$(pwd)/nginx-prefix --without-http_uwsgi_module --without-http_scgi_module --without-http_fastcgi_module
  7 [root@k8smaster01 ~]# cd /opt/k8s/work/nginx-1.15.3/
  8 [root@k8smaster01 nginx-1.15.3]# make && make install



解釋:

  • –with-stream:開啟 4 層透明轉發(TCP Proxy)功能;
  • –without-xxx:關閉所有其他功能,這樣生成的動態鏈接二進製程序依賴最小。
  • [root@k8smaster01 ~]# cd /opt/k8s/work/nginx-1.15.3/
  • [root@k8smaster01 nginx-1.15.3]# ./nginx-prefix/sbin/nginx -v

1.3 驗證編譯后的Nginx

  1 [root@k8smaster01 ~]# cd /opt/k8s/work/nginx-1.15.3
  2 [root@k8smaster01 nginx-1.15.3]# ./nginx-prefix/sbin/nginx -v
  3 nginx version: nginx/1.15.3
  4 [root@k8smaster01 nginx-1.15.3]# ldd ./nginx-prefix/sbin/nginx	#查看 nginx 動態鏈接的庫
  5         linux-vdso.so.1 =>  (0x00007ffdda980000)
  6         libdl.so.2 => /lib64/libdl.so.2 (0x00007feb37300000)
  7         libpthread.so.0 => /lib64/libpthread.so.0 (0x00007feb370e4000)
  8         libc.so.6 => /lib64/libc.so.6 (0x00007feb36d17000)
  9         /lib64/ld-linux-x86-64.so.2 (0x00007feb37504000)



提示:由於只開啟了 4 層透明轉發功能,所以除了依賴 libc 等操作系統核心 lib 庫外,沒有對其它 lib 的依賴(如 libz、libssl 等),以便達到精簡編譯的目的。

1.4 安裝和部署Nginx

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
  4   do
  5     echo ">>> ${master_ip}"
  6     mkdir -p /opt/k8s/kube-nginx/{conf,logs,sbin}
  7   done						#創建Nginx目錄
  8 [root@k8smaster01 ~]# cd /opt/k8s/work
  9 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
 10 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
 11   do
 12     echo ">>> ${master_ip}"
 13     scp /opt/k8s/work/nginx-1.15.3/nginx-prefix/sbin/nginx  root@${master_ip}:/opt/k8s/kube-nginx/sbin/kube-nginx
 14     ssh root@${master_ip} "chmod a+x /opt/k8s/kube-nginx/sbin/*"
 15     ssh root@${master_ip} "mkdir -p /opt/k8s/kube-nginx/{conf,logs,sbin}"
 16   done						#分發Nginx二進制


1.5 配置Nginx 四層透明轉發

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# cat > kube-nginx.conf <<EOF
  3 worker_processes 1;
  4 
  5 events {
  6     worker_connections  1024;
  7 }
  8 
  9 stream {
 10     upstream backend {
 11         hash $remote_addr consistent;
 12         server 172.24.8.71:6443        max_fails=3 fail_timeout=30s;
 13         server 172.24.8.72:6443        max_fails=3 fail_timeout=30s;
 14         server 172.24.8.73:6443        max_fails=3 fail_timeout=30s;
 15     }
 16 
 17     server {
 18         listen 127.0.0.1:8443;
 19         proxy_connect_timeout 1s;
 20         proxy_pass backend;
 21     }
 22 }
 23 EOF
 24 [root@k8smaster01 ~]# cd /opt/k8s/work
 25 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
 26 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
 27   do
 28     echo ">>> ${master_ip}"
 29     scp kube-nginx.conf  root@${master_ip}:/opt/k8s/kube-nginx/conf/kube-nginx.conf
 30   done						#分發Nginx四層透明代理配置文件


1.6 配置Nginx system

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# cat > kube-nginx.service <<EOF
  3 [Unit]
  4 Description=kube-apiserver nginx proxy
  5 After=network.target
  6 After=network-online.target
  7 Wants=network-online.target
  8 
  9 [Service]
 10 Type=forking
 11 ExecStartPre=/opt/k8s/kube-nginx/sbin/kube-nginx -c /opt/k8s/kube-nginx/conf/kube-nginx.conf -p /opt/k8s/kube-nginx -t
 12 ExecStart=/opt/k8s/kube-nginx/sbin/kube-nginx -c /opt/k8s/kube-nginx/conf/kube-nginx.conf -p /opt/k8s/kube-nginx
 13 ExecReload=/opt/k8s/kube-nginx/sbin/kube-nginx -c /opt/k8s/kube-nginx/conf/kube-nginx.conf -p /opt/k8s/kube-nginx -s reload
 14 PrivateTmp=true
 15 Restart=always
 16 RestartSec=5
 17 StartLimitInterval=0
 18 LimitNOFILE=65536
 19 
 20 [Install]
 21 WantedBy=multi-user.target
 22 EOF


1.7 分發Nginx systemd

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
  4   do
  5     echo ">>> ${master_ip}"
  6     scp kube-nginx.service  root@${master_ip}:/etc/systemd/system/
  7   done


二 啟動並驗證

2.1 啟動Nginx

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
  4   do
  5     echo ">>> ${master_ip}"
  6     ssh root@${master_ip} "systemctl daemon-reload && systemctl enable kube-nginx && systemctl restart kube-nginx"
  7   done


2.2 檢查Nginx服務

  1 [root@k8smaster01 ~]# cd /opt/k8s/work
  2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
  3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
  4   do
  5     echo ">>> ${master_ip}"
  6     ssh root@${master_ip} "systemctl status kube-nginx |grep 'Active:'"
  7   done


本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

海洋暖化再創新高 能量如36億枚原子彈爆炸

摘錄自2020年1月14日星島日報、公共電視報導

13日發表的一項最新研究報告指出,世界各大海洋的暖化程度十分嚴重,2019年的海水溫度又再創下有紀錄以來的新高水平。科學家形容目前的情況,好比每一秒投放五枚廣島原子彈在海中。

由14位科學家組成的國際團隊合作進行研究,分析上世紀50年代到近年的據數,計算海洋水面至2,000米深的溫度。他們在科學期刊《大氣科學進展》內發表報告,指全球各地海洋暖化的速度愈來愈快。報告指出,在1955至1986年間,海洋暖化的步伐保持穩定,但在過去數十年加速。在1987至2019年間,海洋暖化程度是對上數十年的四倍半。

2019年的海洋溫度,比1981至2010年間的平均溫度高出攝氏0.075度。過去25年海洋吸收的熱力,相等於36億次廣島原子彈爆炸。

研究也顯示,過去5年同時也是有紀錄以來海洋溫度最高的5年。高溫除了使得海洋生物如珊瑚,魚類和海鳥消失,更會導致海平面上升,造成沿岸洪災,以及產生更多颶風,帶來嚴重災情。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

河北省:將新能源汽車應用到9大公共服務領域

河北省擴大公共服務領域用車範疇,將黨政機關公務車、機要通信車、執法執勤巡邏車、環衛車、郵政車、接送學生校車、城鄉公車(含農村客運車)、城市物流配送車、計程車等九個方面的新能源汽車納入公共服務領域範圍。   河北省要求,全省在新增或更換城市公車以及上述九類的汽車,必須換成新能源汽車,如果再換燃油、燃氣車,將不予上牌。九類新能源汽車購車補貼比例由1:0.5提高到1:1。  
推廣純電動計程車、新能源公車   明年起,河北省將啟動純電動計程車試點工作,張家口市、廊坊市作為首批純電動計程車試點市,各開展50-200輛的純電動計程車運營公司試點工作。逐步在全省範圍內推廣電動計程車。   河北省將統籌考慮用油、用氣、新能源公車一定期限內購置及運營成本,建立鼓勵新能源公車應用、限制燃油公車增長的新機制,調整現行燃油補貼政策,加大對新能源公車支持力度。2015年至2019年,我省新增及更換的公車中新能源公車比重將分別達到40%、50%、60%、70%、80%。  
加快充電設施建設   河北省將進一步加快充電設施建設,把充電站、充電樁建設納入城鄉建設規劃,按照統籌規劃、科學佈局、適度超前、有序建設的原則,加快推進住宅社區、單位內部、社會停車場等面向個人使用的充電設施建設,到2020年基本建成車樁相隨、智能高效的充電基礎設施體系。   河北省將在石家莊、張家口、邯鄲三市進行充電設施建設試點,整合企業、社會、政府等多方力量,在賓館飯店、商場超市、學校醫院、路邊車位、旅遊景點等公共場所,開展充電樁、充電樁群建設,形成規模效應。全省黨政機關、事業單位以及國有企業等也將積極建設充電樁,省直機關率先安裝,做出示範。   該消息是河北新聞網記者從11月27日召開的全省新能源汽車發展和推廣應用工作領導小組(擴大)會議上獲悉的。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

webpack 打包優化的四種方法(多進程打包,多進程壓縮,資源 CDN,動態 polyfill)

如今,webpack 毫無疑問是前端構建領域里最耀眼的一顆星,無論你前端走哪條路線,都需要有很強的webpack 知識。webpack 的基本用法這裏就不展開講了。主要探討一下如何提高 webpack 的打包速度。

這篇文章以 vue cli3.0+webpack4.0+nodejs10.0+ 這幾個版本為例。

一、打包分析

1.1、速度分析

我們的目的是優化打包速度,那肯定需要一個速度分析插件,此時 speed-measure-webpack-plugin 就派上用場了。它的作用如下:

  • 分析整個打包總耗時
  • 每個 pluginloader 的耗時情況

首先,安裝插件

npm i -D speed-measure-webpack-plugin

然後修改 vue.config.js 配置文件 (vuecli3+ 版本的配置文件統一在這個文件里修改,如果沒有該文件,在根目錄新建一個)

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 實例化插件
const smp = new SpeedMeasurePlugin();

module.exports = {
    configureWebpack: smp.wrap({
        plugins: [
            // 這裡是自己項目里需要使用到的其他插件
            new yourOtherPlugin()
        ]
    })
}

運行打包命令之後,可以看到,打包總耗時為 2min,51.99s

1.2、體積分析

分析完打包速度之後,接着我們來分析打包之後每個文件以及每個模塊對應的體積大小。使用到的插件為 webpack-bundle-analyzer,構建完成後會在 8888 端口展示大小。

首先,安裝插件

npm i -D webpack-bundle-analyzer

修改 vue.config.js 配置文件

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 導入體積分析插件
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;

// 實例化速度分析插件
const smp = new SpeedMeasurePlugin();

module.exports = {
    configureWebpack: smp.wrap({
        plugins: [
            // 實例化體積分析插件
            new BundleAnalyzerPlugin()
        ]
    })
}

構建之後可以看到,其中黃色塊 chunk-vendors 文件佔比最大,為 1.34MB

二、打包優化

2.1、多進程多實例構建,資源并行解析

多進程構建的方案比較知名的有以下三個:

  • thread-loader (推薦使用這個)
  • parallel-webpack
  • HappyPack

這裏以 thread-loader 為例配置多進程多實例構建
安裝 loader

npm i -D thread-loader

接下來在 vue.config.js 配置文件中使用該 loader

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 實例化插件
const smp = new SpeedMeasurePlugin();
module.exports = {
    configureWebpack: smp.wrap({
        module: {
            rules: [
                {
                    test: /\.js$/,
                    use: ['thread-loader']
                }
            ]
        }
    })
}

然後看下構建花費的時間, 2min,49.21s,相較於之前提升了 5s

2.2、公用代碼提取,使用 CDN 加載

對於vue,vuex,vue-router,axios,echarts,swiper等我們可以利用webpack的externals參數來配置,這裏我們設定只需要在生產環境中才需要使用。
下面配置 vue.config.js

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 導入體積分析插件
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;

//判斷是否為生產環境
const isProduction = process.env.NODE_ENV === 'production';

//定義 CDN 路徑,這裏採用 bootstrap 的 cdn
const cdn = {
    css: [
        'https://cdn.bootcss.com/Swiper/4.5.1/css/swiper.min.css'
    ],
    js: [
        'https://cdn.bootcss.com/vue/2.6.10/vue.min.js',
        'https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js',
        'https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js',
        'https://cdn.bootcss.com/axios/0.19.0/axios.min.js',
        'https://cdn.bootcss.com/echarts/4.3.0/echarts.min.js',
        'https://cdn.bootcss.com/Swiper/4.5.1/js/swiper.min.js',
    ]
}

// 實例化插件
const smp = new SpeedMeasurePlugin();
module.exports = {
    chainWebpack: config => {
        // 生產環境配置
        if (isProduction) {
            // 生產環境注入 cdn
            config.plugin('html')
                .tap(args => {
                    args[0].cdn = cdn;
                    return args;
                });
        }
    },
    configureWebpack: smp.wrap({
        module: {
            rules: [
                {
                    test: /\.js$/,
                    use: ['thread-loader']
                }
            ]
        },
        plugins: [
            new BundleAnalyzerPlugin()
        ],
        //生產環境注入 cdn
        externals: isProduction && {
            'vue': 'Vue',
            'vuex': 'Vuex',
            'vue-router': 'VueRouter',
            'axios': 'axios',
            'echarts': 'echarts',
            'swiper': 'Swiper'
        } || {}
    })
}

緊接着,改造 html 頁面。用於讓我們配置的 cdn 路徑注入到 html 頁面

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <!-- 使用 CDN 的 CSS 文件 -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
    <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet">
  <% } %>
</head>

<body>
  <noscript>
    <strong>We're sorry but eye-admin doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->

 <!-- 使用 CDN 的 JS 文件 -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
    <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
  <% } %>
</body>

</html>

最重要的一步,看下效果,可以看到現在耗時 1min,39.19s,整整提升了 1 分多鍾!

2.3、多進程多實例并行壓縮

并行壓縮主流有以下三種方案

  • 使用 parallel-uglify-plugin 插件
  • uglifyjs-webpack-plugin 開啟 parallel 參數
  • terser-webpack-plugin 開啟 parallel 參數 (推薦使用這個,支持 ES6 語法壓縮)

安裝插件依賴

npm i -D terser-webpack-plugin

接下來在 vue.config.js 配置文件中使用插件,最終的配置文件如下

// 導入速度分析插件
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");

// 導入代碼壓縮插件
const TerserPlugin = require("terser-webpack-plugin");

// 導入體積分析插件
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;

//判斷是否為生產環境
const isProduction = process.env.NODE_ENV === 'production';

//定義 CDN 路徑,這裏採用 bootstrap 的 cdn
const cdn = {
    css: [
        'https://cdn.bootcss.com/Swiper/4.5.1/css/swiper.min.css'
    ],
    js: [
        'https://cdn.bootcss.com/vue/2.6.10/vue.min.js',
        'https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js',
        'https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js',
        'https://cdn.bootcss.com/axios/0.19.0/axios.min.js',
        'https://cdn.bootcss.com/echarts/4.3.0/echarts.min.js',
        'https://cdn.bootcss.com/Swiper/4.5.1/js/swiper.min.js',
    ]
}

// 實例化插件
const smp = new SpeedMeasurePlugin();
module.exports = {
    chainWebpack: config => {
        // 生產環境配置
        if (isProduction) {
            // 生產環境注入 cdn
            config.plugin('html')
                .tap(args => {
                    args[0].cdn = cdn;
                    return args;
                });
        }
    },
    configureWebpack: smp.wrap({
        module: {
            rules: [
                {
                    test: /\.js$/,
                    use: ['thread-loader']
                }
            ]
        },
        plugins: [
            new BundleAnalyzerPlugin()
        ],
        //生產環境注入 cdn
        externals: isProduction && {
            'vue': 'Vue',
            'vuex': 'Vuex',
            'vue-router': 'VueRouter',
            'axios': 'axios',
            'echarts': 'echarts',
            'swiper': 'Swiper'
        } || {},
        optimization: {
            minimizer: [
                new TerserPlugin({
                    parallel: 4
                })
            ]
        }
    })
}

2.4、使用 polyfill 動態服務

動態 polyfill 指的是根據不同的瀏覽器,動態載入需要的 polyfillPolyfill.io 通過嘗試使用 polyfill 重新創建缺少的功能,可以更輕鬆地支持不同的瀏覽器,並且可以大幅度的減少構建體積。

Polyfill Service 原理

識別 User Agent,下發不同的 Polyfill

使用方法:在 index.html 中引入如下 script 標籤

<script crossorigin="anonymous" src=""></script>

三、完結

At last,看完之後有什麼不懂的,可以留言反饋。

轉載請註明出處:
作者:TSY
個人空間:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開