webpack 1的配置使用

  • webpack是什么?
    webpack是一個前端資源加載/打包工具,有兩種依賴聲明方式:同步和異步。將依賴分割成多個節點,然后每個節點形成一個新的文件塊。經過優化后的文件塊樹,會以一個個文件形式分發出去(僅僅打包成一個大文件形式是很低效的)。
  • webpack有哪些優點?
  • 分離現有依賴樹,按需加載
  • 高效保證第一次加載
  • 靜態資源模塊化
  • 第三方庫模塊化加載
  • 實現加載器幾乎所有環節的可配置性
  • 安裝與使用
// 安裝
npm install -g webpack // 全局安裝方式
npm install webpack  // 本地安裝(建議,聲明webpack依賴創建package.json)
// 使用
npm init  // 將產生一個package.json依賴配置文件
npm install  // 按配置方式安裝依賴
webpack -p // webpack打包
webpack --watch  // 自動監聽變化,動態編譯
  • webpack中的配置項與常用node模塊使用
entry: 應用程序開始執行和webpack開始打包的入口文件
output: webpack輸出結果的相關選項
    path: 所有輸出文件的目標路徑
    filename: 輸出文件
    publicPath: 輸出解析文件的目錄
    library: 導出庫的名稱
    libraryTarget:導出庫的類型
resolve: 解析模塊請求的選項
module: 模塊配置
    test/include: 具有相同的作用,都是必須匹配選項
    exclude: 必不匹配選項(優先于test和include)
    // - 只在 test 和 文件名匹配 中使用正則表達式
    // - 在 include 和 exclude 中使用絕對路徑數組
   // - 盡量避免 exclude,更傾向于使用 include
plugins: 附加插件列表
  • webpack 1 config實例
const path = require('path');
// 引入路徑模式匹配模塊,用于多文件
const glob = require('glob');
const webpack = require('webpack');
// 分離css單獨打包
const ExtractTextPlugin = require('extract-text-webpack-plugin');
// 創建index入口文件
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 獲取webpack.config.js同級目錄作為項目根目錄
const ROOT_PATH = path.resolve(__dirname);
// 獲取所有入口文件
let getEntry = function(gPath) {
    // 需要單獨打包的第三方庫作為單獨的入口
    let entries = {
        jquery: ['jquery'],
        react: ['react', 'react-dom'],
        vendor: ['./index.js']
    };
    glob.sync(gPath).forEach(function(entry) {
        let pname = entry.split('/').splice(3).join('/').split('.')[0];
        entries[pname] = [entry];
    });
    return entries;
};
let isProduction = process.env.NODE_ENV === 'production';
let entries = getEntry('./src/views/**/*.jsx');
let chunks = Object.keys(entries);
const webpack_config = {
    // 頁面入口文件配置
    entry: entries,
    // 入口文件輸出配置
    output: {
        // 指定編譯后代碼位置
        // path: path.resolve(ROOT_PATH, 'dist'),
        path: path.resolve(ROOT_PATH),  // 以根路徑部署,指定當前項目路徑為根路徑
        // 打包JavaScript文件及其依賴文件,并指定生成文件的文件名
        filename: isProduction ? 'assets/js/[name].min.js' : 'assets/js/[name].[hash].js',
        // publicPath: '/dist/',
        publicPath: '/',    // 以根路徑部署,指定當前項目路徑為根路徑
        chunkFilename: 'chunk/[name].chunk.js'
    },
    module: {
        // 加載器模塊配置
        loaders: [
            // .jsx babel-loader編譯處理
            { test: /\.jsx?$/, exclude: /node_modules/, loader: 'babel', query: { presets: ['es2015', 'react'] } },
            // .scss css-loader!sass-loader這里注意,中間用!鏈式loader,從右向左依次執行
            { test: /\.scss$/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader!sass-loader') },
            // images(.png|jpg|gif|svg) url-loader處理,小于10kb的轉為base64
            { test: /\.(png|jpg|gif)$/, loader: 'url-loader', query: {
                limit: 8096,
                name: isProduction ? 'assets/images/[name].[ext]' : 'assets/images/[name].[hash].[ext]'
            }},
            {
                //文件加載器,處理文件靜態資源
                test: /\.(woff|woff2|ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
                loader: 'file-loader',
                query: {
                    limit: 8096,
                    name: isProduction ? 'assets/fonts/[name].[ext]' : 'assets/fonts/[name].[hash].[ext]'
                }
            }
        ]
    },
    plugins: [
        new webpack.ProvidePlugin({
            $: 'jquery',    // 使jquery變成全局變量,這樣就不用在文件中require了
            jQuery: 'jquery',
            React: 'react',
            ReactDOM: 'react-dom',
            classNames: 'classnames'
        }),
        // 類庫統一打包生成一個文件
        new webpack.optimize.CommonsChunkPlugin({
            // 頁面以倒序引用
            name: ['jquery', 'react', 'vendor'],
            filename: isProduction ? 'assets/js/[name].min.js' : 'assets/js/[name].[hash].min.js',
            minChunks: 3    // 提取使用3次以上的模塊打包到vendor里
        }),
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            }
        }),
        new webpack.DefinePlugin({
            'process.env': {
                NODE_ENV: '"production"'
            }
        }),
        new ExtractTextPlugin(isProduction ? 'assets/css/[name].css' : 'assets/css/[name].[hash].css')
    ],
    devtool: isProduction ? null : 'source-map',
    // 熱部署
    devServer: {
        inline: true,
        port: 3000
    }
};
// 生成HTML文件
chunks.forEach(function(pname) {
    // 過濾掉提取的公共庫和使用的第三方庫
    if(pname == 'vendor' || pname == 'react' || pname == 'jquery') {
        return;
    }
    let config = {
        favicon: './src/images/fav.ico',
        title: '默認頁面title',  // 如果模板文件中設置,這里將實效
        filename: pname + '.html',
        template: './template.html',
        inject: 'body',
        minify: {
            removeComments: true,  
            collapseWhitespace: false
        },
        cache: true,
        chunksSortMode: 'dependency'    // 指定引用順序
    };
    // 指定HTML中引入的scripts
    if(pname in webpack_config.entry) {
        config.chunks = ['jquery', 'react', 'vendor', pname];
        if(isProduction) {
            config.hash = false;
        }
    }
    console.log(config);
    webpack_config.plugins.push(new HtmlWebpackPlugin(config));
});

module.exports = webpack_config;

// 更多詳情請參看:https://doc.webpack-china.org/configuration/

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

推薦閱讀更多精彩內容

  • 最近在學習 Webpack,網上大多數入門教程都是基于 Webpack 1.x 版本的,我學習 Webpack 的...
    My_Oh_My閱讀 8,199評論 40 247
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,214評論 7 35
  • GitChat技術雜談 前言 本文較長,為了節省你的閱讀時間,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,706評論 7 110
  • 清晨 牽牛走過你的屋檐 黃昏 云鶴拉走我的小船 夜晚 溪水漫上馬蹄 后來 我的青牛還在你的屋檐
    菅子閱讀 299評論 6 1
  • 最近都想寫一篇文章,孩子已長大成人,總結一下過往的教育問題!沒有對錯,只是給予觀讀者些許借鑒! 教育是一個亙古不變...
    悠然齋主閱讀 746評論 4 14