国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

webpack搭建多頁面系統(三) 理解webpack.config.js的四個核心概念

鄒強 / 1336人閱讀

摘要:關于模板的有好幾種。一次安裝所有的大家可以了解一些的用法把編譯成。安裝參考文檔功能將源文件遷移到指定的目錄,返回新的文件路徑。安裝用法它會將所有的入口中引用的移動到和頁面對應的獨立分離的文件。

webpack是需要自己編寫自己需要的一個配置對象,取決你如何使用webpack,下面指定了所有的可用的配置選項。
參考文檔:https://doc.webpack-china.org...

webapck.config.js

var path = require("path"); #使用Node內置的path模塊,并在它前面加上__dirname這個全局變量。可以防止
不同操作系統之間的文件路徑問題,并且可以使用相對路徑按照預期工作。
var webpackConfig = {
    devtool:"inline-source-map", //開發錯誤提示,嵌入到源文件
    entry:{ },  //string | object | array ;這里應用程序開始執行;webpack開始打包
    output:{ },  //webpack 如何輸出結果的相關選項
    devServer:{ },  //開發服務器配置,
    module:{         //關于模塊配置
        rules:[]     //模塊規則(配置loader、解析器等選項)
    },
    plugins:plugins, //附加插件列表
}
module.exports = webpackConfig;
1、entry參數:入口文件配置
entry: //string | array | object。入口文件是應用程序的起點入口,從這里應用程序啟動執行。如果傳遞的是一個數組,
        那么數組的每一項都會執行。
規則:每個HTML頁面都有一個入口起點。單頁應用(SPA):一個入口起點;多頁應用(MPA):多個入口起點。
命名:如果傳入一個字符串或字符串數組,chunk會被命名為main。如果傳入一個對象,則每一個鍵(key)是chunk的名稱,
        該值描述了chunk的入口起點。


在我的配置中,由于是對多頁面的處理,所以采用entry:object;每一個鍵(key)是chunk的名稱,同時又是chunk的入口起點。

webpack.config.js

//glob在webpack中對文件的路徑處理
var glob = require("glob");
const HtmlWebpackPlugin = require("html-webpack-plugin")
var webpackConfig = {
    /*webpack基礎配置*/
};    
//封裝方法,獲取指定路徑下的入口文件
//返回的結構 [ "src/pages/contact/contact/index.js",
//            "src/pages/index/index/index.js",
//            "src/pages/join/join/index.js",
//            "src/pages/pagea/index/index.js" ]
function getEntries(globPath){
    //方法: glob.sync(pattern,[options]);該方法成功后,返回匹配搜索之后的數組,
    //沒有匹配返回一個空數組;pattern:"src/pages/**/index.js";這里‘**’匹配模式表示的是
    位于src/pages/和/index.js的這兩層文件名
    var files = glob.sync(globPath),
    entries = {};
    files.forEach(function(filepath){
        //取倒數第二層(pages下面的文件夾)做包名
        var split = filepath.split("/");
        var name = split[split.length - 2];
        
        entries[name] = "./" + filepath;
    });
    return entries;
};
//
var entries = getEntries("src/pages/**/index.js");
Object.keys(entries).forEach(function(name){
    //這里循環輸出每一個頁面的entry,
    webpackConfig.entry[name] = entries[name];
    //判斷是否是登陸頁面;因為登陸頁面和其他頁面是兩個不同的模板
    //HtmlWebpackPlugin插件的詳細用法參考:https://segmentfault.com/a/1190000007294861
    if(name == "login/login"){
        var plugin = new HtmlWebpackPlugin({
            //有模板生成的html文件名
            filename:"login.html",
            //登陸頁面的html模板
            template:"./src/login.html",
            inject:"body",
            chunks:["commons",name]
        });
    }else{
        var plugin = new HtmlWebpackPlugin({
            //有模板生成出來的html文件名
            filename:name + ".html",
            //除登陸頁面外,多個頁面使用同一個模板
            template:"./src/index.tmpl.html",
            inject:"body",
            chunks:["commons",name]
        })
    }
})
2、output參數:輸出文件配置

output包括一組選項,指示webpack如何去輸出、以及在哪里輸出你的(bundle、asset和其他你所打包或使用webpack載入的任何內容)。
常用的參數path、publicPath、filename、chunkFilename.
在我的webpack.config.js的配置中:
webpack.config.js:

    var webpackConfig = {
        devtool:"inline-source-map",
        entry:{ },
        output:{
            path:__dirname + "build",
            filename: "js/[name].bundle-[chunkhash:8].js"
        },
        devServer:{ },
        module:{
            rules:rules
        },
        plugins:plugins
    }

output.path:string;output目錄對應一個絕對路徑 #path:path.resolve(__dirname,"bulid")
output.filename:string;此選項決定了每一個輸出bundle的名稱。這些bundle將寫入到output.path選項指定的目錄下。
兩種情況:
1、對于單入口起點,filename會是一個靜態名稱。filename:"bundle.js"。
2、對于多入口起點、代碼拆分或各種插件創建多個bundle,應該使用以下四種方式:

 (a)使用入口名稱:  filename:"[name].bundle.js";
 (b)使用內部chunk id : filename:"[id].bundle.js";
 (c)使用每次構建過程中,唯一的hash生成:filename:"[name].[hash].bundle.js";
 (d)使用基于每個chunk內容的hash: filename:"[chunkhash].bundle.js";

這里涉及到緩存的知識:參考文檔:https://doc.webpack-china.org...
可以通過命中緩存的技術,以降低網絡流量,使網站加載速度更快,如果我們在部署新版本時不更改資源的文件名,瀏覽器就可能認為它沒有更新,就會使用它的緩存版本,通過必要的配置,以確保webpack編譯生成的文件能夠被客戶端緩存,而在文件內容變化后,能夠請求到新的文件。
輸出文件的文件名(output.filename):
通過使用output.filename的不同的方式,可以確保瀏覽器獲取修改后的文件。文檔中建議使用[chunkhash]替換,在文件名中包含一個chunk相關的哈希。

3、常用loader(加載器)配置:module參數

Loaders的常用的加載器,參考文檔:https://doc.webpack-china.org...
安裝相對應的loader:

npm install --save-dev css-loader;作用是指示webpack對每個.css使用css-loader

使用Loader的方法:

在應用程序中,有三種使用loader的方式:
1、配置(推薦):在webpaack.config.js文件中指定loader。
2、內聯:在每個import 語句中顯示指定loader。
3、CLI: 在shell命令中指定它們。
配置[Configuration]:
    module.rules允許你在webpack配置中指定多個loader。這是展示loader的一種簡明方式,有助于使代碼變得簡潔。
    這是我經常用的書寫方式。
    module:{
        rules:[
            {
              test:/.css$/,
              use:[
                  { loader: "style-loader" },
                  {
                    loader:"css-loader",
                    options{
                        modules:true
                    }
                  }
              ]
            }
        ]
    }

下面介紹一些常用的loader的用法:

1、html-loader

html-loader 導出HTML為字符串,需要引用靜態資源。
關于模板(templating)的有好幾種:html-loader、pug-loader、jade-loader、markdown-loader、posthtml-loader、react-markdown-loader、handlebars-loader、markup-inline-loader。

只介紹html-loader的使用:
參考文檔:https://doc.webpack-china.org/loaders/html-loader
安裝:
    npm install --save-dev html-loader
用法:
    默認情況下,每個本地的都需要require(require(./image.png))來進行加載。
    不過這需要file-loader或url-loader(這個后面有介紹)。
示例:
    module:{
        rules:[{
            test:/.html$/,        #匹配以‘.html’結尾的模塊;
            loader:"html-loader",  #html-loader加載器
            options:{              #可選項(一般用于上線的webpack.build.config中)
                minimize: true,            #Boolean: 是否壓縮html
                removeComments: true,      #Boolean: 是否刪除注釋  
                collapseWhitespace: true, #Boolean: 是否刪除空格  
            }
        }]
    }
    
2、babel-loader

babel-loader 加載es2015代碼,并且將代碼轉譯為ES5
參考文檔:https://doc.webpack-china.org...

安裝:
npm install --save-dev babel-loader babel-core babel-preset-env
用法:
在webpack配置對象中,需要添加babel-loader到module的loader列表中,像下面這樣:
module:{
    rules:[
        {
            test:/.js$/,          #匹配以‘.js’結尾的文件
            loader:"babel-loader", #babel-loader加載器
            include:path.resolve(__dirname,"src"),   #只包括src 
            exclude:path.resolve(__dirname,"node_modules"), #排除node_module
            query:{
                presets:["preset-env"]
            }
        }
    ]
}
babel-loader編譯很慢的,為了確保轉譯盡可能少的文件,可能使用/.js$/來匹配,排除node_modules,配置exclude選項,
提高編譯速度。
3、less/css-loader

less/css-loader是對css的處理,下面分別介紹處理css時,用到的css-loader、less-loader、style-loader、postcss-loader。這幾種loader配合使用。
一次安裝所有的loader:
npm install --save-dev autoprefixer css-loader less-loader style-loader postcss-loader
less-loader:

大家可以了解一些less的用法:http://less.bootcss.com/
less-loader: 把less編譯成css。使用css-loader或者raw-loader把它變成一個JS模塊,
并使用ExtractTextPlugin把它解壓到一個多帶帶的文件中,
這樣你的樣式不依賴于JavaScript。另外,less-loader并不會針對url()語法做特別的轉換,
如果想把url()語句里涉及的文件(比如圖片、字體文件)也一并用webpack打包的話,就必須利用css-loader進一步處理。
參考文檔:https://doc.webpack-china.org/loaders/less-loader/
用法:
將css-loader、style-loader、less-loader鏈式調用,使用ExtractTextPlugin把它解壓到多帶帶的文件
webpack.config.js:
    const ExtractTextPlugin = require("extract-text-webpack-plugin");
    plugin = [...
     new ExtractTextPlugin("css/[name]-[chunkhash:8].css",{allChunks:false}), //css分離和壓縮
     ...
    ];
    module:{
        rules:[
            {
                text:/.less$/,
                use:ExtractTextPlugin.extract({
                    fallback:"style-loader",
                    use:[
                        {
                            loader:"css-loader",
                            options:{
                                minimize:false;    #是否對css進行壓縮
                            }
                        },
                        {
                            loader:"postcss-loader", #自動添加瀏覽器前綴
                        },
                        {
                            loader:"less-loader"
                        }
                    ]
                })
            }
        ]
    }

css-loader:

用法:
css-loader解釋@import 和 url(),在import/require()后再解析它們。
選項:
    參考文檔:https://doc.webpack-china.org/loaders/css-loader/
    常用的就是是否對css進行代碼壓縮(Minification):minimize:Boolean;還有就是對url()語句的處理。
    在less/css里url()語句,一般使用相對路徑的方式來指定文件路徑;請不要使用‘/’開頭
    (即相對于網站的根目錄,因為對于文件系統來說,這令人混淆)。

style-loader:

 用法:
 通過注入

    <