成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

webpack學(xué)習(xí)筆記(3)-webpack使用

wwq0327 / 1525人閱讀

摘要:配置如上圖測(cè)試用例所示,由于這個(gè)插件默認(rèn)使用了來(lái)作優(yōu)化,所以它不僅壓縮了代碼刪掉了代碼中無(wú)用的注釋還去除了冗余的優(yōu)化了的書(shū)寫順序,優(yōu)化了你的代碼。

webpack基本使用
// webpack4中除了正常安裝webpack之外,需要再多帶帶安一個(gè)webpack-cli

npm i webpack webpack-cli -D
基本命令行

webpack []

配置文件使用

直接輸入webpack,默認(rèn)執(zhí)行: webpack.config.js or webpackfile.js文件;
如果想自定義文件名,運(yùn)行:webpack --config webpack.conf.dev.js

打包js
// ESmodule
export default function(a,b){
    return a+b
}
import sum from "./sum"

// common.js規(guī)范

module.exports = function(a,b){
    return a-b
}
var minus = require("./minus")

// AMD規(guī)范,多了兩個(gè)bundle,異步加載
//amd規(guī)范
define(function(require, factory) {
    "use strict";
    return function(a,b){
        return a*b
    }
});

require(["./muti"],function(muti){
    console.log("muti,23,24="+muti(23,24))
})
console.log("sum,23,24="+sum(23,24))
console.log("minus,23,24="+minus(23,24))
編譯 ES 6/7

安裝babel-loader, babel-core, babel-preset-env

npm install --save-dev babel-loader babel-core babel-preset-env

babel-loader:在import或加載模塊時(shí),對(duì)es6代碼進(jìn)行預(yù)處理,es6語(yǔ)法轉(zhuǎn)化為es5語(yǔ)法。
babel-core:允許我們?nèi)フ{(diào)用babel的api,可以將js代碼分析成ast(抽象語(yǔ)法樹(shù)),方便各個(gè)插件分析語(yǔ)法進(jìn)行相應(yīng)的處理.
babel-preset-env:為了告訴babel只編譯批準(zhǔn)的內(nèi)容,相當(dāng)于babel-preset-es2015, es2016, es2017及最新版本。通過(guò)它可以使用最新的js語(yǔ)法。

配置webpack.config.js

module.exports = {
    entry:{
        app:"./app.js"
    },
    output:{
        filename:"[name].[hash:5].js"
    },
    module:{
        rules:[
            {
                test:/.js$/,
                use:{
                    loader:"babel-loader",
                    options:{
                        presets:[
                            // 最新的版本
                            ["@babel/preset-env",{ 
                                targets:{// 支持目標(biāo),數(shù)據(jù)來(lái)源于‘can i use’網(wǎng)站
                                    browsers:["> 1%","last 2 versions"]
                                    //chrome:"52"
                                }
                            }]
                        ]
                    }
                },
                //排除相關(guān)文件
                exclude:"/node_modules/"
            }
        ]
    }
}

其中,exclude是定義不希望babel處理的文件。targets是presets的一些預(yù)設(shè)選項(xiàng),這里表示將js用于瀏覽器,只確保占比大于1%的瀏覽器的特性,主流瀏覽器的最新兩個(gè)主版本。
更多與配置有關(guān)的信息,可以參考:
babel env preset設(shè)置,
browserlist預(yù)設(shè)置

由于babel-preset配置選項(xiàng)較多,我們一般可以在根目錄下建立.babelrc文件,專門用來(lái)放置babel preset配置,這是一個(gè)json文件。可以將上述配置修改如下:

//.bablerc文件
{
    "presets": [
        ["env",{
            "targets": {
                "browsers": ["> 1%", "last 2 versions"]
            }
        }]
    ]
}

//原webpack.config.js文件
module: {
    rules: [
        {
            test: /.js$/,
            use: {
                loader: "babel-loader"
            },
            exclude: "/node_modules/"
        }
    ]
}
babel-polifill

在上面的babel配置中,babel只是將一些es6,es7-8的語(yǔ)法轉(zhuǎn)換成符合目標(biāo)的js代碼,但是如果我們使用一些特性或方法,比如Generator, Set, 或者一些方法。babel并不能轉(zhuǎn)換為低版本瀏覽器識(shí)別的代碼。這時(shí)就需要babel-polifill。

簡(jiǎn)單的說(shuō),polifill就是一個(gè)墊片,提供了一些低版本es標(biāo)準(zhǔn)對(duì)高級(jí)特性的實(shí)現(xiàn)。使用polifill的方法如下:

npm install --save babel-polifill

然后在應(yīng)用入口引入polifill,要確保它在任何其他代碼/依賴聲明前被調(diào)用。

//CommonJS module
require("babel-polyfill");

//es module
import "babel-polifill";

在webpack.config.js中,將babel-polifill加入entry數(shù)組中:

entry: ["babel-polifill", "./app.js"]

相比于runtime-transform,polifill用于應(yīng)用開(kāi)發(fā)中。會(huì)添加相應(yīng)變量到全局,所以會(huì)污染全局變量。
更多配置參考:babel-polifill

完整代碼如下:

const path = require("path");
module.exports = {
    //entry為入口,webpack從這里開(kāi)始編譯
    entry: [
        "babel-polyfill",
        path.join(__dirname, "./src/index.js")
    ],
    //output為輸出 path代表路徑 filename代表文件名稱
    output: {
        path: path.join(__dirname, "./bundle"),
        filename: "bundle.js"
    },
    //module是配置所有模塊要經(jīng)過(guò)什么處理
    //test:處理什么類型的文件,use:用什么,include:處理這里的,exclude:不處理這里的
    module: {
        rules: [
            {
                test: /.js$/,
                use: ["babel-loader"],
                include: path.join(__dirname , "src"),
                exclude: /node_modules/
            }
        ]
    },
};
runtime-transform插件

runtime transform也是一個(gè)插件,它與polifill有些類似,但它不污染全局變量,所以經(jīng)常用于框架開(kāi)發(fā)。
安裝:
*npm install --save-dev babel-plugin-transform-runtime

npm install --save babel-runtime*
用法:
將下面內(nèi)容添加到.bablerc文件中

{
    "plugins": ["transform-runtime"]
}

更多配置參考:bable-runtime-transform插件

使用 loader 處理 CSS

1 . 安裝處理 css 相關(guān) loader

// css-loader讓你能import css  , style-loader能將css以style的形式插入
$ npm install --save-dev css-loader style-loader
module.exports = {
    plugins: [require("autoprefixer")]  // 引用該插件即可了
}

然后在webpack里配置postcss-loader

module.exports = {
    module: {
        rules: [
            {
                test: /.css$/,
                use: ["style-loader", "css-loader", "postcss-loader"]
            }
        ]
    }
}

2 . 安裝 less 相關(guān)

npm install --save-dev less less-loader

3 . 添加CSS3前綴
通過(guò)postcss中的autoprefixer可以實(shí)現(xiàn)將CSS3中的一些需要兼容寫法的屬性添加響應(yīng)的前綴,這樣省去我們不少的時(shí)間

npm i postcss-loader autoprefixer -D

創(chuàng)建 postcss.config.js 加入以下代碼

module.exports = {
    plugins: {
        "postcss-cssnext": {}
    }
}

4 . 實(shí)現(xiàn)

src/app.css

body {
  background: pink;
}

src/app.js

import css from "./app.css";

console.log("hello world");
// 處理順序從右到左 less -> postcss -> css -> style
        {
           test: /.css$/,
           use: [ "style-loader", "css-loader" ]
        }

5.用 mini-css-extract-plugin 把 CSS 分離成文件

npm install --save-dev mini-css-extract-plugin
    rules: [
            {
                test: /.css$/,
                use: [MiniCssExtractPlugin.loader, "css-loader"]
            }
    ]


 new MiniCssExtractPlugin({
        filename: "[name].css",// 指定打包后的css
        chunkFilename: "[id].css"
 }),

6.壓縮與優(yōu)化
打包 css 之后查看源碼,我們發(fā)現(xiàn)它并沒(méi)有幫我們做代碼壓縮,這時(shí)候需要使用 optimize-css-assets-webpack-plugin 這個(gè)插件,它不僅能幫你壓縮 css 還能優(yōu)化你的代碼。

npm install --save-dev optimize-css-assets-webpack-plugin
const optimizeCss = require("optimize-css-assets-webpack-plugin");
//配置
optimization: {
  minimizer: [new OptimizeCSSAssetsPlugin()];
}

如上圖測(cè)試用例所示,由于optimize-css-assets-webpack-plugin這個(gè)插件默認(rèn)使用了 cssnano 來(lái)作 css 優(yōu)化,
所以它不僅壓縮了代碼、刪掉了代碼中無(wú)用的注釋、還去除了冗余的 css、優(yōu)化了 css 的書(shū)寫順序,優(yōu)化了你的代碼 margin: 10px 20px 10px 20px; =>margin:10px 20px;。同時(shí)大大減小了你 css 的文件大小。更多優(yōu)化的細(xì)節(jié)見(jiàn)文檔。

插件 生成HTML插件

安裝插件npm install --save-dev html-webpack-plugin 配置 webpack.config.js

npm install --save-dev html-webpack-plugin
const htmlWebpackPlugin = require("html-webpack-plugin");
...
plugins: [
    new htmlWebpackPlugin({
        filename: "index.html",  //打包后的文件名
        template: path.join(__dirname , "./src/index.html"),  // 用哪個(gè)html作為模板,在src目錄下創(chuàng)建一個(gè)index.html頁(yè)面當(dāng)做模板來(lái)用
        hash: true, // 會(huì)在打包好的bundle.js后面加上hash串
    })
],

如果需要多頁(yè)面開(kāi)發(fā),可以這樣寫:

let path = require("path");
let HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
    // 多頁(yè)面開(kāi)發(fā),怎么配置多頁(yè)面
    entry: {
        index: "./src/index.js",
        login: "./src/login.js"
    },
    // 出口文件  
    output: {                       
        filename: "[name].js",
        path: path.resolve("dist")
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: "./src/index.html",   
            filename: "index.html",
            chunks: ["index"]   // 對(duì)應(yīng)關(guān)系,index.js對(duì)應(yīng)的是index.html
        }),
        new HtmlWebpackPlugin({
            template: "./src/login.html",
            filename: "login.html",
            chunks: ["login"]   // 對(duì)應(yīng)關(guān)系,login.js對(duì)應(yīng)的是login.html
        })
    ]
}

html-webpack-plugin用法全解

清理打包文件插件
$ npm i clean-webpack-plugin --save-dev
const CleanWebpackPlugin = require("clean-webpack-plugin");
...
plugins: [
    ...
    new CleanWebpackPlugin(["bundle"]) //傳入清楚路徑
]
提取公共代碼 原因和優(yōu)勢(shì)

原因
1.相同的資源被重復(fù)的加載,浪費(fèi)用戶的流量和服務(wù)器的成本;
2.每個(gè)頁(yè)面需要加載的資源太大,導(dǎo)致網(wǎng)頁(yè)首屏加載緩慢,影響用戶體驗(yàn)。

優(yōu)點(diǎn)
1.減少網(wǎng)絡(luò)傳輸流量,降低服務(wù)器成本;
2.雖然用戶第一次打開(kāi)網(wǎng)站的速度得不到優(yōu)化,但之后訪問(wèn)其它頁(yè)面的速度將大大提升。

optimization

在webpack4之前,提取公共代碼都是通過(guò)一個(gè)叫CommonsChunkPlugin的插件來(lái)辦到的。到了4以后,內(nèi)置了一個(gè)一模一樣的功能,而且起了一個(gè)好聽(tīng)的名字叫“優(yōu)化”

下面我們就來(lái)看看如何提取公共代碼

// 假設(shè)a.js和b.js都同時(shí)引入了jquery.js和一個(gè)寫好的utils.js
// a.js和b.js
import $ from "jquery";
import {sum} from "utils";

那么他們兩個(gè)js中其中公共部分的代碼就是jquery和utils里的代碼了

可以針對(duì)第三方插件和寫好的公共文件

module.exports = {
    entry: {
        a: "./src/a.js",
        b: "./src/b.js"
    },
    output: {
        filename: "[name].js",
        path: path.resolve("dust")
    },
    // 提取公共代碼
+   optimization: {
        splitChunks: {
            cacheGroups: {
                vendor: {   // 抽離第三方插件
                    test: /node_modules/,   // 指定是node_modules下的第三方包
                    chunks: "initial",
                    name: "vendor",  // 打包后的文件名,任意命名    
                    // 設(shè)置優(yōu)先級(jí),防止和自定義的公共代碼提取時(shí)被覆蓋,不進(jìn)行打包
                    priority: 10    
                },
                utils: { // 抽離自己寫的公共代碼,utils這個(gè)名字可以隨意起
                    chunks: "initial",
                    name: "utils",  // 任意命名
                    minSize: 0    // 只要超出0字節(jié)就生成一個(gè)新包
                }
            }
        }
+   },
    plugins: [
        new HtmlWebpackPlugin({
            filename: "a.html",
            template: "./src/index.html",  // 以index.html為模板
+           chunks: ["vendor", "a"]
        }),
        new HtmlWebpackPlugin({
            filename: "b.html",
            template: "./src/index.html",  // 以index.html為模板
+           chunks: ["vendor", "b"]
        })
    ]
}

通過(guò)以上配置,可以把引入到a.js和b.js中的這部分公共代碼提取出來(lái),如下圖所示

webpack-dev-server配置

安裝 webpack-dev-server

npm install --save-dev webpack-dev-server

webpack.config.js 添加配置

...
devServer: {
    contentBase: path.join(__dirname, "bundle"),  //啟動(dòng)路徑
    host:"localhost",  //域名,默認(rèn)是localhost
    port: 8018,  //端口號(hào)
    open: true, //自動(dòng)打開(kāi)瀏覽器
    hot: true //開(kāi)啟熱更新
}

當(dāng)然在npm run dev命令下,打包的文件存在于內(nèi)存中,并不會(huì)產(chǎn)生在dist目錄下

熱更新和自動(dòng)刷新的區(qū)別

配置devServer的時(shí)候,如果hot為true,就代表開(kāi)啟了熱更新

But這并沒(méi)那么簡(jiǎn)單,因?yàn)闊岣逻€需要配置一個(gè)webpack自帶的插件并且還要在主要js文件里檢查是否有module.hot

下面就讓我們直接看下代碼是如何實(shí)現(xiàn)的

// webpack.config.js
let webpack = require("webpack");

module.exports = {
    plugins: [
        // 熱更新,熱更新不是刷新
        new webpack.HotModuleReplacementPlugin()
    ],
    devServer: {
        contentBase: "./dist",
        hot: true,
        port: 3000
    }
}

// 此時(shí)還沒(méi)完雖然配置了插件和開(kāi)啟了熱更新,但實(shí)際上并不會(huì)生效

// index.js
let a = "hello world";
document.body.innerHTML = a;
console.log("這是webpack打包的入口文件");

// 還需要在主要的js文件里寫入下面這段代碼
if (module.hot) {
    // 實(shí)現(xiàn)熱更新
    module.hot.accept();
}
編譯圖片

file-loader
對(duì)一些對(duì)象作為文件來(lái)處理,然后可以返回它的URL。

$ npm install --save-dev file-loader
test: /.(gif|png|jpe?g|svg)$/i,
use: [
  {
    loader: "file-loader",
    options: { 
      name: "[name].[ext]", // 文件名和擴(kuò)展名
      outputPath: "images/"
    }
  },

url-loader

npm i file-loader url-loader -D
module.exports = {
    module: {
        rules: [
            {
                test: /.css$/,
                use: ExtractTextWebpackPlugin.extract({
                    use: "css-loader",
                    publicPath: "../"
                })
            },
            {
                test: /.(jpe?g|png|gif)$/,
                use: [
                    {
                        loader: "url-loader",
                        options: {
                            limit: 8192,    // 小于8k的圖片自動(dòng)轉(zhuǎn)成base64格式,并且不會(huì)存在實(shí)體圖片
                            outputPath: "images/"   // 圖片打包后存放的目錄
                        }
                    }
                ]
            }
        ]
    }
}

解析 html 代碼里面 img 的標(biāo)簽

html-loader: html 變成導(dǎo)出成字符串的過(guò)程中,還能進(jìn)行壓縮處理(minimized)

$ npm install --save-dev html-loader
...
{
  test: /.(gif|png|jpe?g|svg)$/i,
  use: [
    {
      loader: "file-loader",
      options: {
        name: "[name].[ext]",
        outputPath: "images/"
      }
    },
  ]
},
// 下面幾行才是 html-loader 的配置內(nèi)容
{
  test: /.html$/,
  use: [ {
    loader: "html-loader",
    options: {
      minimize: true
    }
  }],
}
...

壓縮圖片

image-webpack-loader:壓縮圖片文件

$  npm install image-webpack-loader --save-dev
{
  test: /.(gif|png|jpe?g|svg)$/i,
  use: [
    {
      loader: "file-loader",
      options: {
        name: "[name].[ext]",
        outputPath: "images/"
      }
    },
    {
      loader: "image-webpack-loader",
      options: {
        bypassOnDebug: true,
      }
    }
  ]
},
{
  test: /.html$/,
  use: [ {
    loader: "html-loader",
    options: {
      minimize: true
    }
  }],
}
resolve解析

在webpack的配置中,resolve我們常用來(lái)配置別名和省略后綴名

module.exports = {
    resolve: {
        // 別名
        alias: {
            $: "./src/jquery.js"
        },
        // 省略后綴
        extensions: [".js", ".json", ".css"]
    },
}
打包速度

webpack 4 在項(xiàng)目中實(shí)際測(cè)了下,普遍能提高 20%~30%的打包速度。

首先你需要知道你目前打包慢,是慢在哪里。

我們可以用 speed-measure-webpack-plugin 這個(gè)插件,它能監(jiān)控 webpack 每一步操作的耗時(shí)。如下圖:

可以看出其實(shí)大部分打包花費(fèi)的時(shí)間是在Uglifyjs壓縮代碼。和前面的提升熱更新的切入點(diǎn)差不多,查看source map的正確與否,exclude/include的正確使用等等。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97110.html

相關(guān)文章

  • webpack 學(xué)習(xí)筆記(一)

    摘要:引言最近在學(xué)習(xí),發(fā)現(xiàn)好多知識(shí)點(diǎn),之前一點(diǎn)都沒(méi)有接觸過(guò),如等等。使用本地安裝,會(huì)存于文件夾內(nèi)與屬性內(nèi),更方便項(xiàng)目文件遷移以及協(xié)同開(kāi)發(fā)等情況。 引言 最近在學(xué)習(xí)webpack,發(fā)現(xiàn)好多知識(shí)點(diǎn),之前一點(diǎn)都沒(méi)有接觸過(guò),如babel、core-js、browserslist等等。以前習(xí)慣了使用cli構(gòu)建項(xiàng)目,很多東西不用考慮,拿來(lái)就用,這樣的碼農(nóng)是不會(huì)有能力提升的,必須了解更多的知識(shí)點(diǎn),才能成為...

    zhangwang 評(píng)論0 收藏0
  • webpack學(xué)習(xí)筆記

    摘要:運(yùn)行該語(yǔ)句會(huì)執(zhí)行如下步驟使用進(jìn)行文件壓縮。設(shè)置環(huán)境變量,觸發(fā)某些包,以不同的方式進(jìn)行編譯。在原始的源碼中執(zhí)行查找和替換操作。等同于表示任何出現(xiàn)的地方都會(huì)被替換為。提供函數(shù)用來(lái)合并配置對(duì)象當(dāng)文件小于限制,會(huì)返回。 選項(xiàng) 1.devtool:通過(guò)在瀏覽器調(diào)試工具(browser devtools)中添加元信息(meta info)增強(qiáng)調(diào)試。 2.resolve.alias:創(chuàng)建 impor...

    Soarkey 評(píng)論0 收藏0
  • React學(xué)習(xí)筆記1:環(huán)境搭建

    摘要:新搭建的個(gè)人博客,本文地址學(xué)習(xí)筆記環(huán)境搭建本文的書(shū)寫環(huán)境為,之后會(huì)補(bǔ)充下的差異創(chuàng)建學(xué)習(xí)目錄初始化項(xiàng)目根據(jù)相關(guān)提示完善信息,入口文件安裝相關(guān)包,并且使用也就是支持,需要包,因?yàn)槲抑白鰝€(gè)一些相關(guān)項(xiàng)目,所以部分包已經(jīng)全局安裝,比如等等,大家 新搭建的個(gè)人博客,本文地址:React學(xué)習(xí)筆記1:環(huán)境搭建 本文的書(shū)寫環(huán)境為mac,之后會(huì)補(bǔ)充windows下的差異 1、創(chuàng)建學(xué)習(xí)目錄 mkdir l...

    Sourcelink 評(píng)論0 收藏0
  • 我的webpack學(xué)習(xí)筆記(一)

    摘要:前言在上一篇文章中我介紹了學(xué)習(xí)前的準(zhǔn)備工作,下面開(kāi)始的學(xué)習(xí)。目標(biāo)一般我們接觸到的關(guān)于的文章,都是以解讀官方文檔為主,而且是針對(duì)單頁(yè)面項(xiàng)目的應(yīng)用。我先在假設(shè)要做一個(gè)多頁(yè)面應(yīng)用,該如何去通過(guò)打包。 前言 在上一篇文章中我介紹了學(xué)習(xí)webpack前的準(zhǔn)備工作,下面開(kāi)始webpack的學(xué)習(xí)。 *創(chuàng)建webpack-demo文件夾 $ mkdir webpack-demo $ cd webpac...

    wh469012917 評(píng)論0 收藏0
  • 我的webpack學(xué)習(xí)筆記(一)

    摘要:前言在上一篇文章中我介紹了學(xué)習(xí)前的準(zhǔn)備工作,下面開(kāi)始的學(xué)習(xí)。目標(biāo)一般我們接觸到的關(guān)于的文章,都是以解讀官方文檔為主,而且是針對(duì)單頁(yè)面項(xiàng)目的應(yīng)用。我先在假設(shè)要做一個(gè)多頁(yè)面應(yīng)用,該如何去通過(guò)打包。 前言 在上一篇文章中我介紹了學(xué)習(xí)webpack前的準(zhǔn)備工作,下面開(kāi)始webpack的學(xué)習(xí)。 *創(chuàng)建webpack-demo文件夾 $ mkdir webpack-demo $ cd webpac...

    CrazyCodes 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<