webpack 基礎(chǔ)一 1002

webpack 基礎(chǔ)一

1.webpack開(kāi)篇

<body>
<!--
1.什么是webpack?
webpack是一套基于NodeJS的"模塊打包工具",
在webpack剛推出的時(shí)候就是一個(gè)單純的JS模塊打包工具,可以將多個(gè)模塊的JS文件合并打包到一個(gè)文件中
但是隨著時(shí)間的推移、眾多開(kāi)發(fā)者的追捧和眾多開(kāi)發(fā)者的貢獻(xiàn)
現(xiàn)在webpack不僅僅能夠打包JS模塊, 還可以打包CSS/LESS/SCSS/圖片等其它文件

2.為什么要分模塊?
如果將所有的JS代碼都寫(xiě)到一個(gè)文件中, 十分不利于代碼的維護(hù)和復(fù)用
所以我們可以將不同的功能寫(xiě)到不同的模塊中, 這樣就提升了代碼的維護(hù)性和復(fù)用性
但是當(dāng)將代碼寫(xiě)到不同模塊時(shí)新的問(wèn)題又出現(xiàn)了,
例如: 導(dǎo)入資源變多了, 請(qǐng)求次數(shù)變多了, 網(wǎng)頁(yè)性能也就差了
例如: 不同功能都放到了不同模塊中了, 那么如何維護(hù)模塊之間的關(guān)系也變成一個(gè)難題了
    <script src="./header.js"></script>
    <script src="./content.js"></script>
    <script src="./index.js"></script>
    <script src="./footer.js"></script> // 如果index.js中用到了footer,就會(huì)報(bào)錯(cuò),因?yàn)轫樞驁?zhí)行的原因
例如: ... ...

3.如何解決上述問(wèn)題
3.1 將上述js文件封裝成模塊,在主文件中再導(dǎo)入依賴(lài)模塊
3.2項(xiàng)目上線時(shí)將用到的所有模塊都合并到一個(gè)文件中,通過(guò)webpack打包
3.3在index.html中只導(dǎo)入主文件

4.如何通過(guò)webpack來(lái)打包JS模塊
4.1安裝webpack
npm init -y
npm install --save-dev webpack
npm install --save-dev webpack-cli
4.2在終端中輸入打包的指令
npx webpack index.js
注意點(diǎn):
index.js就是需要打包的文件
打包之后的文件會(huì)放到dist目錄中, 名稱(chēng)叫做main.js
-->
  <!--如下,我把header ,content,footer放在index里,然后打包index代碼就可以了
<script src="index.js"></script>
<script src="Header.js"></script>
<script src="Content.js"></script>
<script src="Footer.js"></script>
-->
<script src="dist/main.js"></script>
</body>

2.webpack配置文件

2.1
<body>
<!--
1.什么是webpack配置文件?
我們?cè)诖虬麶S文件的時(shí)候需要輸入:  npx webpack index.js
這句指令的含義是: 利用webpack將index.js和它依賴(lài)的模塊打包到一個(gè)文件中
其實(shí)在webpack指令中除了可以通過(guò)命令行的方式告訴webpack需要打包哪個(gè)文件以外,
還可以通過(guò)配置文件的方式告訴webpack需要打包哪個(gè)文件

2.webpack常見(jiàn)配置
entry: 需要打包的文件
output: 打包之后輸出路徑和文件名稱(chēng)
mode: 打包模式  development/production
development: 不會(huì)壓縮打包后的JS代碼
production:  會(huì)自動(dòng)壓縮打包后的JS代碼
-->
<!--<script src="dist/main.js"></script>-->
<script src="bundle/bundle.js"></script>
</body>

js代碼如下

const path = require("path");

module.exports = {
    /*
    mode: 指定打包的模式, 模式有兩種
    一種是開(kāi)發(fā)模式(development): 不會(huì)對(duì)打包的JS代碼進(jìn)行壓縮
    還有一種就是上線(生產(chǎn))模式(production): 會(huì)對(duì)打包的JS代碼進(jìn)行壓縮
    * */
    mode: "development", // "production" | "development"
    /*
    entry: 指定需要打包的文件
    * */
    entry: "./index.js",
    /*
    output: 指定打包之后的文件輸出的路徑和輸出的文件名稱(chēng)
    * */
    output: {
        /*
        filename: 指定打包之后的JS文件的名稱(chēng)
        * */
        filename: "bundle.js",
        /*
        path: 指定打包之后的文件存儲(chǔ)到什么地方
        * */
        path: path.resolve(__dirname, "bundle")
    }
};
2.2 配置文件注意點(diǎn)
<body>
<!--
1.webpack配置注意事項(xiàng)
配置文件的名稱(chēng)必須叫做: webpack.config.js, 否則直接輸入 npx webpack打包會(huì)出錯(cuò)
如果要使用其它名稱(chēng), 那么在輸入打包命令時(shí)候必須通過(guò) --config 指定配置文件名稱(chēng)
npx webpack --config xxx

2.打包命令簡(jiǎn)化
每次輸入npx webpack --config xxx來(lái)打包文件會(huì)有一點(diǎn)蛋疼, 所以我們可以通過(guò)npm script來(lái)簡(jiǎn)化這個(gè)操作
即在初始化npm后在package.json改為如下
 "scripts": {
    "test": "npx webpack --config webpack.config.js"
  },
-->
<script src="bundle/bundle.js"></script>
</body>

3.sourcemap

<body>
<!--
1.什么是sourcemap?
webpack打包后的文件會(huì)自動(dòng)添加很多代碼, 在開(kāi)發(fā)過(guò)程中非常不利于我們?nèi)フ{(diào)試
因?yàn)槿绻\(yùn)行webpack打包后的代碼,錯(cuò)誤提示的內(nèi)容也是打包后文件的內(nèi)容
所以為了降低調(diào)試的難度, 提高錯(cuò)誤代碼的閱讀性, 我們就需要知道打包后代碼和打包之前代碼的映射關(guān)系
只要有了這個(gè)映射關(guān)系我們就能很好的顯示錯(cuò)誤提示的內(nèi)容, 存儲(chǔ)這個(gè)映射關(guān)系的文件我們就稱(chēng)之為sourcemap

2.如何開(kāi)啟sourcemap
https://www.webpackjs.com/configuration/devtool/
2.1在webpack.config.js中添加
devtool: "xxx",
2.2各配置項(xiàng)說(shuō)明:
eval:
不會(huì)單獨(dú)生成sourcemap文件, 會(huì)將映射關(guān)系存儲(chǔ)到打包的文件中, 并且通過(guò)eval存儲(chǔ)
優(yōu)勢(shì): 性能最好
缺點(diǎn): 業(yè)務(wù)邏輯比較復(fù)雜時(shí)候提示信息可能不全面不正確

source-map:
會(huì)單獨(dú)生成sourcemap文件, 通過(guò)單獨(dú)文件來(lái)存儲(chǔ)映射關(guān)系
優(yōu)勢(shì): 提示信息全面,可以直接定位到錯(cuò)誤代碼的行和列
缺點(diǎn): 打包速度慢

inline:
不會(huì)單獨(dú)生成sourcemap文件, 會(huì)將映射關(guān)系存儲(chǔ)到打包的文件中, 并且通過(guò)base64字符串形式存儲(chǔ)

cheap:
生成的映射信息只能定位到錯(cuò)誤行不能定位到錯(cuò)誤列

module:
不僅希望存儲(chǔ)我們代碼的映射關(guān)系, 還希望存儲(chǔ)第三方模塊映射關(guān)系, 以便于第三方模塊出錯(cuò)時(shí)也能更好的排錯(cuò)

了解后我們只需要以下用就行
2.3企業(yè)開(kāi)發(fā)配置:
development: cheap-module-eval-source-map
只需要行錯(cuò)誤信息, 并且包含第三方模塊錯(cuò)誤信息, 并且不會(huì)生成單獨(dú)sourcemap文件

production: cheap-module-source-map
只需要行錯(cuò)誤信息, 并且包含第三方模塊錯(cuò)誤信息, 并且會(huì)生成單獨(dú)sourcemap文件
-->
<script src="bundle/bundle.js"></script>
</body>

js代碼

//在上面配置文件的基礎(chǔ)上加上以下配置即可
   /*
配置sourcemap
development: cheap-module-eval-source-map
production: cheap-module-source-map
* */
devtool: "cheap-module-source-map",

4.接下來(lái)要學(xué)習(xí)各種各樣的loader

4.1 loader基本概念
<body>
<!--
1.什么是loader?
webapck的本質(zhì)是一個(gè)模塊打包工具, 所以webpack默認(rèn)只能處理JS文件,不能處理其他文件,
因?yàn)槠渌募袥](méi)有模塊的概念, 但是在企業(yè)開(kāi)發(fā)中我們除了需要對(duì)JS進(jìn)行打包以外,
還有可能需要對(duì)圖片/CSS等進(jìn)行打包, 所以為了能夠讓webpack能夠?qū)ζ渌奈募?lèi)型進(jìn)行打包,
在打包之前就必須將其它類(lèi)型文件轉(zhuǎn)換為webpack能夠識(shí)別處理的模塊,
用于將其它類(lèi)型文件轉(zhuǎn)換為webpack能夠識(shí)別處理模塊的工具我們就稱(chēng)之為loader

2.如何使用loader
webpack中的loader都是用NodeJS編寫(xiě)的, 但是在企業(yè)開(kāi)發(fā)中我們完全沒(méi)有必要自己編寫(xiě),
因?yàn)橐呀?jīng)有眾多大神幫我們編寫(xiě)好了企業(yè)中常用的loader, 我們只需要安裝、配置、使用即可

2.1通過(guò)npm安裝對(duì)應(yīng)的loader
2.2按照l(shuí)oader作者的要求在webpack進(jìn)行相關(guān)配置
2.3使用配置好的loader
-->
</body>
4.2 fileloader使用
<!--
fileloader使用
https://www.webpackjs.com/loaders/file-loader/
1.1安裝file-loader
npm install --save-dev file-loader
1.2在webpack.config.js中配置file-loader

module: 告訴webpack如何處理webpack不能夠識(shí)別的文件

module: {
    rules: [
      {
        test: /\.(png|jpg|gif)$/,
        use: [
          {
            loader: 'file-loader',
            options: {}
          }
        ]
      }
    ]
  }
-->
</body>
4.3 loader其他配置
<body>
<!--
注意點(diǎn):
默認(rèn)情況下fileloader生成的圖片名就是文件內(nèi)容的 MD5 哈希值
如何想打包后不修改圖片的名稱(chēng), 那么可以新增配置  name: "[name].[ext]"
其它命名規(guī)則詳見(jiàn): placeholders

注意點(diǎn):
默認(rèn)情況下fileloader會(huì)將生成的圖片放到dist根目錄下面
如果想打包之后放到指定目錄下面, 那么可以新增配置 outputPath: "images/"

注意點(diǎn):
如果需要將圖片托管到其它服務(wù)器, 那么只需在打包之前配置 publicPath: "托管服務(wù)器地址"即可
-->
</body>

js代碼如下

module: {
        rules: [
            {
                test: /\.(png|jpg|gif)$/,
                use: [
                    {
                        loader: 'file-loader',
                        options: {
                            // 指定打包后文件名稱(chēng)
                            name: '[name].[ext]',
                            // 指定打包后文件存放目錄
                            outputPath: 'images/',
                            // 指定托管服務(wù)器地址(統(tǒng)一替換圖片地址)
                            publicPath: 'http://www.it666.com/images/'
                        }
                    }
                ]
            }
        ]
    }
4.4 url-loader的使用
<body>
<!--
1.urlloader
url-loader 功能類(lèi)似于 file-loader,
但是在文件大小(單位 byte)低于指定的限制時(shí),可以返回一個(gè) DataURL

2.urlloader使用
https://www.webpackjs.com/loaders/url-loader/
2.1安裝urlloader
npm install --save-dev url-loader
2.2配置urlloader
{
    test: /\.(png|jpg|gif)$/,
    use: [
            {
                loader: 'url-loader',
                options: {
                    /*
                    limit: 指定圖片限制的大小
                    如果被打包的圖片超過(guò)了限制的大小, 就會(huì)將圖片保存為一個(gè)文件
                    如果被打包的圖片沒(méi)有超過(guò)限制的大小, 就會(huì)將圖片轉(zhuǎn)換成base64的字符串
                    注意點(diǎn):
                    對(duì)于比較小的圖片, 我們將圖片轉(zhuǎn)換成base64的字符串之后, 可以提升網(wǎng)頁(yè)的性能                           (因?yàn)闇p少了請(qǐng)求的次數(shù))
                    對(duì)于比較大的圖片, 哪怕我們將圖片轉(zhuǎn)換成了base64的字符串之后, 也不會(huì)提升網(wǎng)                           頁(yè)的性能, 還有可能降低網(wǎng)頁(yè)的性能
                    (因?yàn)閳D片如果比較大, 那么轉(zhuǎn)換之后的字符串也會(huì)比較多, 那么網(wǎng)頁(yè)的體積就會(huì)比較                        大, 那么訪問(wèn)的速度就會(huì)變慢)
                    */
                    limit: 1024 * 100,
                    // 指定打包后文件名稱(chēng)
                    name: '[name].[ext]',
                    // 指定打包后文件存放目錄
                    outputPath: 'images/',
                }
            }
        ]
}

優(yōu)勢(shì):
圖片比較小的時(shí)候直接轉(zhuǎn)換成base64字符串圖片, 減少請(qǐng)求次數(shù)
圖片比較大的時(shí)候由于生成的base64字符串圖片也比較大, 就保持原有的圖片
-->
</body>
4.5 css-loader的使用
<body>
<!--
1.css-loader
和圖片一樣webpack默認(rèn)能不能處理CSS文件, 所以也需要借助loader將CSS文件轉(zhuǎn)換為webpack能夠處理的類(lèi)型

2.css-loader使用:
2.1安裝cssloader
npm install --save-dev css-loader
2.2安裝styleloader
npm install style-loader --save-dev
2.3配置css-loader
{
    test: /\.css$/,
    use: [ 'style-loader', 'css-loader' ]
}

3.css-loader和style-loader作用
css-loader:   解析css文件中的@import依賴(lài)關(guān)系
style-loader: 將webpack處理之后的內(nèi)容插入到HTML的HEAD代碼中

注意點(diǎn):
4.loader特點(diǎn):
4.1單一原則, 一個(gè)loader只做一件事情
4.2多個(gè)loader會(huì)按照從右至左, 從下至上的順序執(zhí)行
例如: 從右至左
      [ 'style-loader', 'css-loader' ]
      先執(zhí)行css-loader解析css文件關(guān)系拿到所有內(nèi)容,
      再執(zhí)行style-loader將內(nèi)容插入到HTML的HEAD代碼中
例如: 從下至上
    [{
        loader: "style-loader"
    },{
        loader: "css-loader"
    }]
    先執(zhí)行css-loader解析css文件關(guān)系拿到所有內(nèi)容,
    再執(zhí)行style-loader將內(nèi)容插入到HTML的HEAD代碼中
-->
</body>
4.6 ES6-Module
<body>
<!--
1.ES6模塊化
在ES6出現(xiàn)之前,JS不像其他語(yǔ)言擁有“模塊化”這一概念,于是為了支持JS模塊化
我們使用類(lèi)、立即執(zhí)行函數(shù)或者第三方插件(RequireJS、seaJS)來(lái)實(shí)現(xiàn)模塊化
但是在ES6出現(xiàn)之后, 上述解決方案都已經(jīng)被廢棄, 因?yàn)镋S6中正式引入了模塊化的概念

ES6模塊化模塊和NodeJS中一樣, 一個(gè)文件就是一個(gè)模塊, 模塊中的數(shù)據(jù)都是私有的
ES6模塊化模塊和NodeJS中一樣, 可以通過(guò)對(duì)應(yīng)的關(guān)鍵字暴露模塊中的數(shù)據(jù),
                             可以通過(guò)對(duì)應(yīng)的關(guān)鍵字導(dǎo)入模塊, 使用模塊中暴露的數(shù)據(jù)

2.ES6模塊化使用
2.1常規(guī)導(dǎo)出
2.1.1分開(kāi)導(dǎo)入導(dǎo)出
export xxx;
import {xxx} from "path";

2.1.2一次性導(dǎo)入導(dǎo)出
export {xxx, yyy, zzz};
import {xxx, yyy, zzz} from "path";

注意點(diǎn):
接收導(dǎo)入變量名必須和導(dǎo)出變量名一致
如果想修改接收變量名可以通過(guò) xxx as newName方式
變量名被修改后原有變量名自動(dòng)失效

2.2默認(rèn)導(dǎo)入導(dǎo)出
export default xxx;
import xxx from "path";

注意點(diǎn):
一個(gè)模塊只能使用一次默認(rèn)導(dǎo)出, 多次無(wú)效
默認(rèn)導(dǎo)出時(shí), 導(dǎo)入的名稱(chēng)可以和導(dǎo)出的名稱(chēng)不一致
-->
<script src="index.js"></script>
</body>

來(lái)用js寫(xiě)一下

/*
ES6模塊化的第一種方式
導(dǎo)出數(shù)據(jù): export {xxx};
導(dǎo)入數(shù)據(jù): import {xxx} from "path";
*/
/*
注意點(diǎn):
1.如果是通過(guò)export {xxx};方式導(dǎo)出數(shù)據(jù), 那么在導(dǎo)入接收的時(shí)候接收的變量名稱(chēng)必須和導(dǎo)出的名稱(chēng)一致
  究其原因是因?yàn)樵趯?dǎo)入的時(shí)候本質(zhì)上是ES6的解構(gòu)賦值
2.如果是通過(guò)export {xxx};方式導(dǎo)出數(shù)據(jù), 又想在導(dǎo)入數(shù)據(jù)的時(shí)候修改接收的變量名稱(chēng), 那么可以使用as來(lái)修改
  但是如果通過(guò)as修改了接收的變量名稱(chēng), 那么原有的變量名稱(chēng)就會(huì)失效
*/

import {name} from "./a.js";//a.js中定義name

/*
下為解構(gòu)賦值
let obj = {
    name: "lnj",
    age: 34
};
let {name, age} = obj;
console.log(name);
let {str, age} = obj; str是undefined
console.log(str);
console.log(age);
 */

//下為注意點(diǎn)2
import {name as str} from "./a.js";

console.log(name);//此時(shí)name啥也沒(méi)了
console.log(str);


/*
ES6模塊化的第二種方式
導(dǎo)出數(shù)據(jù): export default xxx;
導(dǎo)入數(shù)據(jù): import xxx from "path";
*/
/*
注意點(diǎn):
1.如果是通過(guò)export default xxx;導(dǎo)出數(shù)據(jù), 那么在接收導(dǎo)出數(shù)據(jù)的時(shí)候變量名稱(chēng)可以和導(dǎo)出的名字不一致
2.如果是通過(guò)export default xxx;導(dǎo)出數(shù)據(jù), 那么在模塊中只能使用一次export default
*/

// import name from "./b.js";此時(shí)兩種方式都正確
import str from "./b.js";
console.log(str);


//此時(shí)下面使用了兩次導(dǎo)出的操作,所以會(huì)報(bào)錯(cuò)
import name from "./b.js";
import age from "./b.js";
console.log(name);
console.log(age);



// 兩種方式混合使用
import Person,{name, age, say} from "./c.js"; //c中定義了三個(gè)變量和一個(gè)Person類(lèi),采用不同的導(dǎo)出方式
let p = new Person();
console.log(p);

console.log(name);
console.log(age);
say();


//學(xué)習(xí)了es6的導(dǎo)入導(dǎo)出后,我們以前使用的require導(dǎo)入就可以換一種寫(xiě)法
// const icon = require("./lnj.jpg");
// const _ = require("./index.css");

import icon from "./lnj.jpg";
import "./index.css";

let oImg = document.createElement("img");
oImg.src = icon;
oImg.setAttribute("class", "size");//index.css中對(duì)圖片進(jìn)行了一些操作
document.body.appendChild(oImg);
4.7 less-loader
<body>
<!--
1.less-loader
自動(dòng)將less轉(zhuǎn)換為CSS

2.less-loader使用:
2.0安裝less
npm install --save-dev less
2.1安裝less-loader
npm install --save-dev less-loader
2.2配置less-loader
在rules中添加以下代碼
{
    test: /\.less$/,
    use: [{
        loader: "style-loader"
    }, {
        loader: "css-loader"
    }, {
        loader: "less-loader"
    }]
}

注意點(diǎn):
因?yàn)閘oader是從右至左從下至上,所以必須先由less-loader處理往后才能交給其他loader處理
-->
</body>
4.8 sass-loader
<body>
<!--
1.scss-loader
自動(dòng)將scss轉(zhuǎn)換為CSS

2.scss-loader使用:
2.0安裝scss
npm install --save-dev node-sass
2.1安裝less-loader
npm install --save-dev sass-loader
2.2配置less-loader
{
  test: /\.scss$/,
  use: [{
      loader: "style-loader" // 將 JS 字符串生成為 style 節(jié)點(diǎn)
  }, {
      loader: "css-loader" // 將 CSS 轉(zhuǎn)化成 CommonJS 模塊
  }, {
      loader: "sass-loader" // 將 Sass 編譯成 CSS
  }]
}

注意點(diǎn):
因?yàn)閘oader是從右至左從下至上,所以必須先由sass-loader處理往后才能交給其他loader處理
-->
</body>
4.9 PostCSS-loader之補(bǔ)全前綴(棒呆了)
<body>
<!--
1.什么是PostCSS?
https://www.postcss.com.cn/
PostCSS和sass/less不同, 它不是CSS預(yù)處理器
PostCSS是一款使用插件去轉(zhuǎn)換CSS的工具,
PostCSS有許多非常好用的插件
例如
autoprefixer(自動(dòng)補(bǔ)全瀏覽器前綴)
postcss-pxtorem(自動(dòng)把px代為轉(zhuǎn)換成rem)
... ...
-->

<!--
2.使用PostCSS自動(dòng)補(bǔ)全瀏覽器前綴
2.1安裝postcss-loader
npm i -D postcss-loader
2.2安裝需要的插件
npm i -D autoprefixer
2.3配置postcss-loader
在css-loader or less-loader or sass-loader之前添加postcss-loader
2.4創(chuàng)建postcss-loader配置文件(新加的一步)
postcss.config.js
https://github.com/browserslist/browserslist#queries
2.5在postcss.config.js配置文件中配置autoprefixer
module.exports = {
    plugins: {
        "autoprefixer": {
            "overrideBrowserslist": [
                // "ie >= 8", // 兼容IE7以上瀏覽器
                // "Firefox >= 3.5", // 兼容火狐版本號(hào)大于3.5瀏覽器
                // "chrome  >= 35", // 兼容谷歌版本號(hào)大于35瀏覽器,
                // "opera >= 11.5" // 兼容歐朋版本號(hào)大于11.5瀏覽器,
                "chrome  >= 36", // 如果需要適配的瀏覽器完全兼容則不會(huì)添加前綴
            ]
        }
    }
};
-->
</body>
4.10 PostCSS-loader之轉(zhuǎn)換px為rem(棒呆了)

在前邊的項(xiàng)目中,為了適配屏幕,學(xué)習(xí)了許多適配方法,最常用的有通過(guò)rem適配,我們先通過(guò)圖片大小以及屏幕大小計(jì)算根目錄的fontsize(計(jì)算方法在前面的筆記),然后使用的時(shí)候我們需要這樣來(lái)寫(xiě),比如高度是300px,我們得寫(xiě)300/100rem(舉個(gè)例子),現(xiàn)在有了PostCSS-loader就不用這么麻煩了.

<body>
<!--
3.使用PostCSS自動(dòng)將px轉(zhuǎn)換成rem
https://www.npmjs.com/package/postcss-pxtorem

3.1安裝postcss-pxtorem
npm install postcss-pxtorem -D
3.2在postcss.config.js配置文件中配置postcss-pxtorem
"postcss-pxtorem": {
            rootValue: 100, // 就是我們上面要除的那個(gè)100,也就是原始圖片每一份的大小
            // propList: ['*'] // 可以從px更改到rem的屬性
            propList: ["height"]
        }

rootValue (Number) root 元素的字體大小。
unitPrecision (Number) 允許REM單位增長(zhǎng)到的十進(jìn)制數(shù)。
propList ( array ) 可以從px更改到rem的屬性。
    值需要精確匹配。
    使用通配符 * 啟用所有屬性。 示例:['*']
    在單詞的開(kāi)頭或者結(jié)尾使用 *。 ( ['*position*'] 將匹配 background-position-y )
    使用 與屬性不匹配。! 示例:['*','letter-spacing']!
    將"非"前綴與其他前綴合并。 示例:['*','font*']!
selectorBlackList ( array ) 要忽略和離開(kāi)的選擇器。
    如果值為字符串,它將檢查選擇器是否包含字符串。
    ['body'] 將匹配 .body-class
    如果值為 regexp,它將檢查選擇器是否匹配正則表達(dá)式。
    [/^body$/] 將匹配 body,但不匹配 .body
replace (Boolean) 替代包含rems的規(guī)則,而不是添加回退。
mediaQuery (Boolean) 允許在媒體查詢(xún)中轉(zhuǎn)換 px。
minPixelValue (Number) 設(shè)置要替換的最小像素值。

突然感覺(jué)淡淡不憂傷了, 過(guò)去麻煩的事webpack都幫我們做完了
-->
</body>
4.11 css-loader 模塊化
<body>
<!--
1.默認(rèn)情況下通過(guò)import "./xxx.css"導(dǎo)入的樣式是全局樣式
也就是只要被導(dǎo)入, 在其它文件中也可以使用
如果想要導(dǎo)入的CSS文件只在導(dǎo)入的文件中有效, 那么就需要開(kāi)啟CSS模塊化
{
    loader: "css-loader",
    options: {
        modules: true // 開(kāi)啟CSS模塊化
    }
}
然后在導(dǎo)入的地方通過(guò) import xxx from "./xxx.css"導(dǎo)入
然后在使用的地方通過(guò) xxx.className方式使用即可
-->
</body>

舉個(gè)例子

import icon from "./lnj.jpg";
// import "./index.css"
import cssModule from "./index.css"http://導(dǎo)入方式改變
import {addImage} from "./custom.js";

console.log(cssModule);
let oImg = document.createElement("img");
oImg.src = icon;
// oImg.setAttribute("class", "size");
oImg.setAttribute("class", cssModule.size);//使用方式改變
document.body.appendChild(oImg);

addImage();//這里是另一個(gè)js文件,如下
//本來(lái)在沒(méi)有模塊化時(shí), less文件中的size類(lèi)會(huì)對(duì)兩張圖片作用,而模塊化后,只對(duì)當(dāng)前文件的圖片產(chǎn)生作用

/*
import icon from "./lnj.jpg";

function addImage() {
    let oImg = document.createElement("img");
    oImg.src = icon;
    oImg.setAttribute("class", "size");
    document.body.appendChild(oImg);
}
export {addImage};
*/
4.12 iconfont-loader使用
<body>
<!--
1.如何打包字體圖標(biāo)
字體圖標(biāo)中也用到了url用到了文件, 所以我們需要通過(guò)file-loader來(lái)處理字體圖標(biāo)文件
{
    test: /\.(eot|svg|ttf|woff|woff2)$/,
    use:[{
        loader: "file-loader",
        options: {
            name: "[name].[ext]",
            outputPath: "font/",
        }
    }]
}
-->
</body>

在js使用時(shí)

import "./font/iconfont.css"

document.body.innerHTML = "<i class='iconfont icon-icon' style='font-size: 100px'></i>";

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,505評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,017評(píng)論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,786評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,219評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,438評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,796評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,995評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,230評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,918評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,697評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

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

  • 寫(xiě)在開(kāi)頭 先說(shuō)說(shuō)為什么要寫(xiě)這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,310評(píng)論 4 31
  • 全局安裝webpack 全局安裝webpack會(huì)有個(gè)問(wèn)題,就是當(dāng)你有兩個(gè)項(xiàng)目依賴(lài)于不同版本的webpack,就會(huì)有...
    説好的妹紙呢閱讀 1,846評(píng)論 0 11
  • webpack 是什么? 本質(zhì)上,webpack 是一個(gè)現(xiàn)代 JavaScript 應(yīng)用程序的靜態(tài)模塊打包器(mo...
    IT老馬閱讀 3,336評(píng)論 2 27
  • 目錄第1章 webpack簡(jiǎn)介 11.1 webpack是什么? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,747評(píng)論 0 1
  • 2019年的最終目標(biāo)就是達(dá)成年入50萬(wàn),四個(gè)板塊做提升,財(cái)務(wù)培訓(xùn)機(jī)構(gòu)銷(xiāo)售、減肥加微商代理、財(cái)務(wù)考證、寫(xiě)作運(yùn)營(yíng)。 ?...
    欣然_簡(jiǎn)然閱讀 550評(píng)論 0 1