React項(xiàng)目的webpack配置

因?yàn)閞eact接觸webpack,一直用react腳手架里面現(xiàn)成的配置文件,使用webpack進(jìn)行開發(fā),最近研究一下webpack的API,做下學(xué)習(xí)筆記

概念

本質(zhì)上,webpack 是一個(gè)現(xiàn)代 JavaScript 應(yīng)用程序的靜態(tài)模塊打包器(module bundler)。當(dāng) webpack 處理應(yīng)用程序時(shí),它會(huì)遞歸地構(gòu)建一個(gè)依賴關(guān)系圖(dependency graph),其中包含應(yīng)用程序需要的每個(gè)模塊,然后將所有這些模塊打包成一個(gè)或多個(gè) bundle。

實(shí)現(xiàn)功能:

  • 壓縮CSS和JS文件
  • 壓縮IMG等圖片資源
  • 項(xiàng)目中直接使用LESS
  • 直接使用ES6

Webpack支持Node.js模塊格式的配置文件,默認(rèn)使用當(dāng)前目錄下的webpack.config.js,配置文件為module.exports;其相關(guān)配置如下:

  • entry 為項(xiàng)目入口文件
  • output為構(gòu)建文件的輸出配置,其中publicPath表示構(gòu)建結(jié)果最終被真正訪問(wèn)時(shí)的路徑。線上項(xiàng)目為線上路徑。
  • loader 值為一個(gè)數(shù)組,每一項(xiàng)指定一個(gè)規(guī)則,其test字段則是規(guī)則的正則表達(dá)式,若被依賴模塊的ID符合該正則表達(dá)式,則對(duì)依賴模塊依次使用規(guī)則中l(wèi)oaders字段所指定的loader進(jìn)行轉(zhuǎn)換
  • plugin 值為一個(gè)數(shù)組,每一項(xiàng)為一個(gè)plugin實(shí)例

1. entry

  • 寫單頁(yè)面應(yīng)用的時(shí)候 就一個(gè)入口 index.js
entry: {
   app: './src/app.js',
   vendors: './src/vendors.js'
 }

字符串形式;
數(shù)組形式,把數(shù)組中多個(gè)文件打包成一個(gè)文件 ;
對(duì)象形式,配置多頁(yè)應(yīng)用時(shí)需要采用,或者抽離指定模塊做公共模塊

  • 多頁(yè)面應(yīng)用程序
入口文件有幾個(gè)就會(huì)生成幾個(gè)獨(dú)立的依賴圖譜。
entry: {
   pageOne: './src/pageOne/index.js',
   pageTwo: './src/pageTwo/index.js',
   pageThree: './src/pageThree/index.js'
 }

2. output

將所有的模塊和資源打包完成后,總需要一個(gè)地方來(lái)放置它,output 就是做這個(gè)事情的,它指定了打包后的文件放置的位置,以及命名等信息。
其最基本配置包括filename和path兩項(xiàng)。這兩項(xiàng)用以決定上述主js文件的存儲(chǔ)行為。

{
 entry: {
   app: './src/app.js',
   search: './src/search.js'
 },
 output: {
   filename: '[name].js',
   path: __dirname + '/dist'
 }
}
如果配置創(chuàng)建了多個(gè)單獨(dú)的 "chunk"(例如,使用多個(gè)入口起點(diǎn)或使用像 CommonsChunkPlugin 這樣的插件),則應(yīng)該使用占位符([name])來(lái)確保
每個(gè)文件具有唯一的名稱,此時(shí)輸出的文件名是app和search。

3. module

首先webpack是一個(gè)JS模塊打包器,基于NodeJS環(huán)境,本身只理解JS文件。在webpack的世界里,一切文件都是模塊。如果要處理非JS文件,就需配置module。

概念:在模塊化編程中,開發(fā)者將程序分解成離散功能塊(discrete chunks of functionality),并稱之為模塊。每個(gè)模塊具有比完整程序更小的接觸面,使得校驗(yàn)、調(diào)試、測(cè)試輕而易舉。 精心編寫的模塊提供了可靠的抽象和封裝界限,使得應(yīng)用程序中每個(gè)模塊都具有條理清楚的設(shè)計(jì)和明確的目的。

webpack 將一切資源看做是一個(gè)個(gè)模塊,然后將其加入依賴樹中。任何類型的模塊或者說(shuō)資源文件,理論上都可以通過(guò)被轉(zhuǎn)化為JavaScript代碼實(shí)現(xiàn)與其他模塊的合并與加載

webpack中的模塊:ES2015 import;commonjs require();AMD define 與 require;css/scss/less 中的 @import;存在于樣式表中的 url() 或 html 中的 <img src=...> 的圖片

4. loader

loader 用于對(duì)模塊的源代碼進(jìn)行轉(zhuǎn)換。loader 可以將文件從不同的語(yǔ)言(如 TypeScript)轉(zhuǎn)換為 JavaScript,或?qū)?nèi)聯(lián)圖像轉(zhuǎn)換為 data URL。loader 甚至允許你直接在 JavaScript 模塊中 import CSS文件

module: {
//識(shí)別文件類型,使用對(duì)應(yīng)loader處理文件
    rules: [
      {
        test: /\.css$/,
        use: [
          { loader: 'style-loader' },
          {
            loader: 'css-loader',
            options: {
              modules: true//使用options等命令對(duì)loader進(jìn)行進(jìn)一步的配置。
            }
          }
        ]
      }
    ]
  }

關(guān)于loader能夠做的事情:
轉(zhuǎn)換編譯:script-loader/babel-loader/ts-loader/coffee-loader等。
處理樣式:style-loader/css-loader/less-loader/sass-loader/postcss-loader等。
處理文件:raw-loader/url-loader/file-loader/等。
處理數(shù)據(jù):csv-loader/xml-loader等。
處理模板語(yǔ)言:html-loader/pug-loader/jade-loader/markdown-loader等。
清理和測(cè)試:mocha-loader/eslint-loader。

5. plugins

插件是webpack的支柱功能,許多功能都靠插件來(lái)實(shí)現(xiàn):
抽離公共代碼;
統(tǒng)一修改所有代碼中的某些值;
對(duì)代碼進(jìn)行壓縮;
去除所有的console
并且webpack內(nèi)置了很多插件和第三方插件;

Babel 是一個(gè) JavaScript 編譯器

首先要下載babel相關(guān)插件,核心插件如下:

  • 安裝babel-loader
npm install babel-loader --save-dev
  • 安裝轉(zhuǎn)碼規(guī)則
npm install babel-preset-es2015 --save-dev
  • 創(chuàng)建一個(gè).babelrc文件
{
  "presets": [
    "es2015"http://這里是轉(zhuǎn)碼規(guī)則 想要什么樣的轉(zhuǎn)碼規(guī)則可以自行下載插件 然后將規(guī)則加到這里
  ],
  "plugins": []
}
  • 在webpack配置文件中添加babel-loader配置
module.exports = {
  module: {
    rules: [
          {
                test: /\.js$/,
                exclude: /node_modules/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['env']
                    }
                }
          },
     ]
  }
};

https://www.cnblogs.com/old-street-hehe/p/7116215.html

webpack樣式編譯器

css-loader與style-loader和autoprefixer(postcss-loader)

js文件中import了css文件,并且想要把css文件作為<style>的內(nèi)容插入到模版文件,這時(shí)候我們要用到webpack的css-loader和style-loader,前者用于在js中加載css,后者把加載的css作為style標(biāo)簽內(nèi)容插入到html中。另外,如果某些css要考慮到瀏覽器的兼容性(比如css3中的flex),我們要webpack在打包的過(guò)程中自動(dòng)為這些css屬性加上瀏覽器前綴,這時(shí)就用到了postcss-loader和它對(duì)應(yīng)的插件autoprefixer。
css-loader使你能夠使用類似@import 和 url(...)的方法實(shí)現(xiàn) require()的功能,style-loader將所有的計(jì)算后的樣式加入頁(yè)面中,二者組合在一起使你能夠把樣式表嵌入webpack打包后的JS文件中。

  • 在webpack配置文件中添加css的loader配置

配置一:css會(huì)和js打包到同一個(gè)文件中,并不會(huì)打包為一個(gè)單獨(dú)的css文件

module.exports = {

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

配置二:將CSS文件打包為單獨(dú)文件

const ExtractTextPlugin = require("extract-text-webpack-plugin");
//extract-text-webpack-plugin該插件的主要是為了抽離css樣式,防止將樣式打包在js中引起頁(yè)面樣式加載錯(cuò)亂的現(xiàn)象
module.exports = {
   ...
    module: {
       rules: [
            {
                test:/\.css$/,
                exclude: /node_modules/,
                // 抽取 css 文件到單獨(dú)的文件夾
                //use:指需要什么樣的loader去編譯文件,這里由于源文件是.css所以選擇css-loader
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    //fallback:編譯后用什么loader來(lái)提取css文件
                    publicPath: config.cssPublicPath,
                    // 設(shè)置 css 的 publicPath
                    use: [{
                        loader:"css-loader",
                        options:{
                            // 開啟 css 壓縮
                            minimize:true,
                        }
                    },
                        {
                            loader:"postcss-loader",
                        }
                    ]
                })
            }
        ]
    }
}

一點(diǎn)node的知識(shí):

全局變量

__dirname:node中的全局變量,存儲(chǔ)的是文件所在的文件目錄
__filename:node中的全局變量,存儲(chǔ)的是文件名

占位符

[id]:webpack給塊分配的內(nèi)部chunk id,如果你沒(méi)有隱藏,你能在打包后的命令行中看到;
[hash]:每次構(gòu)建過(guò)程中,生成的唯一 hash 值;
[chunkhash]: 依據(jù)于打包生成文件內(nèi)容的 hash 值,內(nèi)容不變,值不變;
[ext]: 資源擴(kuò)展名,如js,jsx,png等等;
[name]:代表打包后文件的名稱,在entry或代碼中(之后會(huì)看到)確定;
requiare.resolve,讀取文件絕對(duì)路徑
參考文章
http://blog.csdn.net/meinanqihao/article/details/78217918
https://www.cnblogs.com/senjougahara/p/5350196.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容