<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        為什么我們要做三份 Webpack 配置文件

        來源:懂視網 責編:小采 時間:2020-11-27 22:29:51
        文檔

        為什么我們要做三份 Webpack 配置文件

        為什么我們要做三份 Webpack 配置文件:在知乎上我們常常會看到有同學發問:BAT 等大型網站的前端工程是如何組織管理的?這的確是一個可以發散的很廣的 Q&A,我想如果要我回答這個問題,不如先從 Webpack 配置說起。 時至今日,Webpack 已經成為前端工程必備的基礎工具之一,不僅被廣泛用于前端工
        推薦度:
        導讀為什么我們要做三份 Webpack 配置文件:在知乎上我們常常會看到有同學發問:BAT 等大型網站的前端工程是如何組織管理的?這的確是一個可以發散的很廣的 Q&A,我想如果要我回答這個問題,不如先從 Webpack 配置說起。 時至今日,Webpack 已經成為前端工程必備的基礎工具之一,不僅被廣泛用于前端工

        在知乎上我們常常會看到有同學發問:BAT 等大型網站的前端工程是如何組織管理的?這的確是一個可以發散的很廣的 Q&A,我想如果要我回答這個問題,不如先從 Webpack 配置說起。

        時至今日,Webpack 已經成為前端工程必備的基礎工具之一,不僅被廣泛用于前端工程發布前的打包,還在開發中擔當本地前端資源服務器(assets server)、模塊熱更新(hot module replacement)、API Proxy 等角色,結合 ESLint 等代碼檢查工具,還可以實現在對源代碼的嚴格校驗檢查。

        正如上文中提到的,前端從開發到部署前都離不開 Webpack 的參與,而 Webpack 的默認配置文件只有一個,即 webpack.config.js,那么問題來了,開發期和部署前應該使用同一份 Webpack 配置嗎?答案肯定是否定的,既然 webpack.config.js 是一個 JS 文件,我們當然可以在文件里寫 JavaScript 業務邏輯,通過讀取環境變量 NODE_ENV 來判斷當前是在開發(dev)時還是最終的生產環境(production),然而很多同學習慣把這兩者的配置都混寫在根目錄下的 webpack.config.js,通過很多零散的 if...else 來“臨時”決定某一個 plugin 或者某一個 loader 的配置項,隨著 loaders 和 plugins 的不斷增加,久而久之 webpack.config.js 變得原來越隆長,代碼的可讀性和可維護性也大大下降。

        我想通過本文來介紹一種用 3 個 JS 文件來配置 Webpack 的方法,這里借鑒了很多開源項目的配置,同時也結合了我們自己在開發中碰到的種種問題解決方案。

                本文中提及的配置基于 Webpack 2 或以上,建議使用 3.0 及以上版

        開發環境與生產環境的區別

        開發環境

         ·NODE_ENV 為 development

         ·啟用模塊熱更新(hot module replacement)

         ·額外的 webpack-dev-server 配置項,API Proxy 配置項

         ·輸出 Sourcemap

        生產環境

         ·NODE_ENV 為 production

         · 將 React、jQuery 等常用庫設置為 external,直接采用 CDN 線上的版本

         · 樣式源文件(如 css、less、scss 等)需要通過 ExtractTextPlugin 獨立抽取成 css 文件

         · 啟用 post-css

         · 啟用 optimize-minimize(如 uglify 等)

         ·中大型的商業網站生產環境下,是絕對不能有 console.log() 的,所以要為 babel 配置Remove console transform

        這里需要說明的是因為開發環境下啟用了 hot module replacement,為了讓樣式源文件的修改也同樣能被熱替換,不能使用 ExtractTextPlugin,而轉為隨 JS Bundle 一起輸出。

        你需要三份配置文件

        1. webpack.base.config.js

        在 base 文件里,你需要將開發環境和生產環境中通用的配置集中放在這里:

        const CleanWebpackPlugin = require('clean-webpack-plugin');
        const path = require('path');
        const webpack = require('webpack');
        // 配置常量
        // 源代碼的根目錄(本地物理文件路徑)
        const SRC_PATH = path.resolve('./src');
        // 打包后的資源根目錄(本地物理文件路徑)
        const ASSETS_BUILD_PATH = path.resolve('./build');
        // 資源根目錄(可以是 CDN 上的絕對路徑,或相對路徑)
        const ASSETS_PUBLIC_PATH = '/assets/';
        module.exports = {
         context: SRC_PATH, // 設置源代碼的默認根路徑
         resolve: {
         extensions: ['.js', '.jsx'] // 同時支持 js 和 jsx
         },
         entry: {
         // 注意 entry 中的路徑都是相對于 SRC_PATH 的路徑
         vendor: './vendor',
         a: ['./entry-a'],
         b: ['./entry-b'],
         c: ['./entry-c']
         },
         output: {
         path: ASSETS_BUILD_PATH,
         publicPath: ASSETS_PUBLIC_PATH,
         filename: './[name].js'
         },
         module: {
         rules: [
         {
         enforce: 'pre', // ESLint 優先級高于其他 JS 相關的 loader
         test: /\.jsx?$/,
         exclude: /node_modules/,
         loader: 'eslint-loader'
         },
         {
         test: /\.jsx?$/,
         exclude: /node_modules/,
         // 建議把 babel 的運行時配置放在 .babelrc 里,從而與 eslint-loader 等共享配置
         loader: 'babel-loader'
         },
         {
         test: /\.(png|jpg|gif)$/,
         use:
         [
         {
         loader: 'url-loader',
         options:
         {
         limit: 8192,
         name: 'images/[name].[ext]'
         }
         }
         ]
         },
         {
         test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
         use:
         [
         {
         loader: 'url-loader',
         options:
         {
         limit: 8192,
         mimetype: 'application/font-woff',
         name: 'fonts/[name].[ext]'
         }
         }
         ]
         },
         {
         test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
         use:
         [
         {
         loader: 'file-loader',
         options:
         {
         limit: 8192,
         mimetype: 'application/font-woff',
         name: 'fonts/[name].[ext]'
         }
         }
         ]
         }
         ]
         },
         plugins: [
         // 每次打包前,先清空原來目錄中的內容
         new CleanWebpackPlugin([ASSETS_BUILD_PATH], { verbose: false }),
         // 啟用 CommonChunkPlugin
         new webpack.optimize.CommonsChunkPlugin({
         names: 'vendor',
         minChunks: Infinity
         })
         ]
        };

        2. webpack.dev.config.js

        這是用于開發環境的 Webpack 配置,繼承自 base:

        const webpack = require('webpack');
        
        // 讀取同一目錄下的 base config
        const config = require('./webpack.base.config');
        
        // 添加 webpack-dev-server 相關的配置項
        config.devServer = {
         contentBase: './',
         publicPath: '/assets/'
        };
        // 有關 Webpack 的 API 本地代理,另請參考 https://webpack.github.io/docs/webpack-dev-server.html#proxy 
        config.module.rules.push(
         {
         test: /\.less$/,
         use: [
         'style-loader',
         'css-loader',
         'less-loader'
         ],
         exclude: /node_modules/
         }
        );
        // 真實場景中,React、jQuery 等優先走全站的 CDN,所以要放在 externals 中
        config.externals = {
         react: 'React',
         'react-dom': 'ReactDOM'
        };
        
        // 添加 Sourcemap 支持
        config.plugins.push(
         new webpack.SourceMapDevToolPlugin({
         filename: '[file].map',
         exclude: ['vendor.js'] // vendor 通常不需要 sourcemap
         })
        );
        // Hot module replacement
        Object.keys(config.entry).forEach((key) => {
         // 這里有一個私有的約定,如果 entry 是一個數組,則證明它需要被 hot module replace
         if (Array.isArray(config.entry[key])) {
         config.entry[key].unshift(
         'webpack-dev-server/client?http://0.0.0.0:8080',
         'webpack/hot/only-dev-server'
         );
         }
        });
        config.plugins.push(
         new webpack.HotModuleReplacementPlugin()
        );
        module.exports = config;

        3. webpack.config.js

        這是用于生產環境的 webpack 配置,同樣繼承自 base:

        const webpack = require('webpack');
        const ExtractTextPlugin = require('extract-text-webpack-plugin');
        // 讀取同一目錄下的 base config
        const config = require('./webpack.base.config');
        config.module.rules.push(
         {
         test: /\.less$/,
         use: ExtractTextPlugin.extract(
         {
         use: [
         'css-loader',
         'less-loader'
         ],
         fallback: 'style-loader'
         }
         ),
         exclude: /node_modules/
         }
        );
        config.plugins.push(
         // 官方文檔推薦使用下面的插件確保 NODE_ENV
         new webpack.DefinePlugin({
         'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production')
         }),
         // 啟動 minify
         new webpack.LoaderOptionsPlugin({ minimize: true }),
         // 抽取 CSS 文件
         new ExtractTextPlugin({
         filename: '[name].css',
         allChunks: true,
         ignoreOrder: true
         })
        );
        module.exports = config;

        現在在你的工程文件夾里應該已經有三個 Webpack 配置文件,它們分別是:

         · webpack.base.config.js
         · webpack.dev.config.js

         · webpack.config.js

        最后,你還需要在 package.json 里添加相應的配置:

        {
         ...
         "scripts": {
         "build": "webpack --optimize-minimize",
         "dev": "webpack-dev-server --config webpack.dev.config.js",
         "start": "npm run dev" // 或添加你自己的 start 邏輯
         },
         ...
        }

        和很多項目一樣,在開發環境下的時候,你需要使用 npm run dev 來啟動,而在生產環境中,則用 npm run build 來發布。
        題外話,在真實場景中,我們不會直接使用 webpack-dev-server,而采用 express + webpack/webpack-dev-middleware,配置方法與上面所述的完全相同。

        關于專欄

        如果你喜歡這篇文章,就請關注我的專欄《前端零?!罚谶@里我們一起聊一聊前端技術和前端工程。

        關于作者

        Henry,10 歲開始學習計算機編程,高二暑假獲得江蘇省青少年信息奧林匹克一等獎。2000 年開始自學 JavaScript 及網頁制作,2006 年起正式開始從事前端開發工作,從此一干就是 10 多年。加入阿里巴巴前,曾在 SAP 中國研究院擔任智慧交通大數據產品經理。

        Github:MagicCube (Henry Li)

         小結

        前端從開發到部署前都離不開 Webpack 的參與,本文結合了我們自己在開發中碰到的種種問題解決方案,同時借鑒了很多開源項目的配置來介紹一種用 3 個 JS 文件來配置 Webpack 的方法。關于本文如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        為什么我們要做三份 Webpack 配置文件

        為什么我們要做三份 Webpack 配置文件:在知乎上我們常常會看到有同學發問:BAT 等大型網站的前端工程是如何組織管理的?這的確是一個可以發散的很廣的 Q&A,我想如果要我回答這個問題,不如先從 Webpack 配置說起。 時至今日,Webpack 已經成為前端工程必備的基礎工具之一,不僅被廣泛用于前端工
        推薦度:
        標簽: 配置 我們 3個
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日本免费xxxx| a级日本高清免费看| 999国内精品永久免费视频| 亚洲国产一二三精品无码| 久久精品成人免费观看97| 亚洲男人第一无码aⅴ网站| 曰批全过程免费视频免费看| 国产在线观看www鲁啊鲁免费| 亚洲偷自拍另类图片二区| 大学生高清一级毛片免费| 亚洲色欲色欱wwW在线| 毛片A级毛片免费播放| 亚洲成在人线在线播放无码| 永久中文字幕免费视频网站| 深夜A级毛片视频免费| 亚洲一区二区高清| AAA日本高清在线播放免费观看| 最新国产AV无码专区亚洲| 在线成人精品国产区免费| 亚洲高清美女一区二区三区| 日韩免费精品视频| 亚洲一区二区三区免费在线观看| 最近最好的中文字幕2019免费| 亚洲国产精品ⅴa在线观看| 午夜亚洲国产成人不卡在线| 成人国产精品免费视频| 亚洲第一页在线视频| 无人在线观看完整免费版视频| 亚洲av午夜国产精品无码中文字 | 老妇激情毛片免费| 久久久久国产亚洲AV麻豆 | 亚洲AV无码专区电影在线观看| 免费国产黄网站在线观看视频| 亚洲中文无码永久免| 亚洲国产精品自产在线播放| 免费成人在线电影| 亚洲欧美黑人猛交群| 成人午夜亚洲精品无码网站| 啦啦啦高清视频在线观看免费| 免费视频成人国产精品网站 | 亚洲精品天堂在线观看|