webpack 4.x之搭建前端開發環境

来源:https://www.cnblogs.com/gerry2019/archive/2019/03/27/10611293.html
-Advertisement-
Play Games

webpack是一個現代JavaScript應用程式的靜態模塊打包器,借用官網的一張圖,它能夠將一些預處理語言,js的最新語法轉換成瀏覽器識別的內容。現在一般的前端框架都有比較成熟的腳手架,大多數對webpack都有個較好的集成,我們只需要敲一些簡單的命令就能生成一個通用的項目模板,比較便捷,但是要 ...


  webpack是一個現代JavaScript應用程式的靜態模塊打包器,借用官網的一張圖,它能夠將一些預處理語言,js的最新語法轉換成瀏覽器識別的內容。現在一般的前端框架都有比較成熟的腳手架,大多數對webpack都有個較好的集成,我們只需要敲一些簡單的命令就能生成一個通用的項目模板,比較便捷,但是要知其然知其所以然,所以今天就嘗試著從零開始搭建一個前端開發環境。

  項目源碼:

    https://github.com/gerryli0214/webpack-demo

  webpack的四個核心概念:

    1、入口(entry)

    2、輸出(output)

    3、loader

    4、插件(plugins)

  首先,我們執行下npm init;初始化一個node工程,填寫項目的信息,整個項目的目錄結構如下:

  

  全部安裝webpack-cli:

npm install webpack-cli -g

  安裝項目webpack依賴:

npm install webpack webpack-cli -D

  新建一個webpack.config.js,這個是webpack預設配置文件,在裡面我們可以配置打包信息,初始化文件為:

const config = {};

module.exports = config;

  入口(entry):

    項目的入口文件,可以配置單個/多個,為入口文件的相對路徑,type:string/object;我們項目入口文件為index.js。

const config = {
    entry: './src/index.js'
}

module.exports = config;

  輸出(output):

    打包後的文件路徑和配置信息,path為打包文件路徑,filename為輸出文件名稱,name為原始文件名稱,hash為打包後的hash地址:

output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[hash].min.js'
}

  loader:

    loader能夠處理非JavaScript文件,webpack預設只能處理JavaScript文件。在使用loader時,首先要安裝下指定loader的依賴,此部分的配置規則與之前版本有所差異,具體配置如下:

npm install babel-loader css-loader -D
 module: {
        rules: [{
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: 'css-loader'
                })
            },
            {
                test: /\.js/,
                exclude: /node_modules/, //過濾node_modules文件夾
                use: [{
                    loader: 'babel-loader'
                }]
            }
        ]
    }

  插件(plugins):

    插件是webpack最為強大的功能之一,利用插件,我們可以進行代碼的混淆、壓縮、重新定義項目環境變數等。插件分為webpack內置插件和第三方插件,第三方插件在使用時首先要安裝依賴和導入依賴模塊。詳細的使用方法可以參考npm。下麵羅列了幾個項目中常用的插件:

    html-webpack-plugin:

      主要作用:

        1、為html文件中引入的外部資源如scriptlink動態添加每次compile後的hash,防止引用緩存的外部文件問題

        2、可以生成創建html入口文件,比如單頁面可以生成一個html文件入口,配置多個就可以打包成多頁面

    extract-text-webpack-plugin:

      主要作用:分離打包的css文件

    uglifyjs-webpack-plugin:

      主要作用:混淆js代碼

    webpack-bundle-analyzer:

      主要作用:生成打包文件報告,可以看到各個模塊打包後文件大小信息

    clean-webpack-plugin:

      主要作用:每次打包之前清除dist文件夾

    配置信息如下: 

 1 const path = require('path');
 2 const webpack = require('webpack');
 3 const HtmlWebpackPlugin = require('html-webpack-plugin');
 4 const ExtractTextPlugin = require('extract-text-webpack-plugin');
 5 const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
 6 const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
 7 const CleanWebpackPlugin = require('clean-webpack-plugin');
 8 
 9 const config = {
10     entry: './src/index.js',
11     output: {
12         path: path.resolve(__dirname, 'dist'),
13         filename: '[name].[hash].min.js'
14     },
15     module: {
16         rules: [{
17                 test: /\.css$/,
18                 use: ExtractTextPlugin.extract({
19                     fallback: 'style-loader',
20                     use: 'css-loader'
21                 })
22             },
23             {
24                 test: /\.js/,
25                 exclude: /node_modules/, //過濾node_modules文件夾
26                 use: [{
27                     loader: 'babel-loader'
28                 }]
29             }
30         ]
31     },
32     optimization: {
33         splitChunks: {
34             name: "vendor",
35             filename: 'vendor-[hash].min.js'
36         },
37         minimizer: [new UglifyJsPlugin()]
38     },
39     plugins: [
40         new HtmlWebpackPlugin({ template: './src/index.html' }),
41         new ExtractTextPlugin({
42             filename: 'build.min.css',
43             allChunks: true,
44         }),
45         new webpack.BannerPlugin({
46             banner: `構建時間:${new Date().getFullYear()}-${new Date().getMonth()+1}-${new Date().getDate()}`
47         }),
48         new CleanWebpackPlugin(),
49         // new webpack.EnvironmentPlugin({ NODE_ENV: 'production' }),
50         new BundleAnalyzerPlugin()
51     ]
52 };
53 
54 module.exports = config;

  以上為打包的基礎配置信息,在我們實際開發中,經常會用到前端開發服務,模塊熱更新以及前端的跨域請求代理,webpack中提供了webpack-dev-server來滿足我們的需求,在使用之前先安裝下webpack-dev-server的依賴:

npm install webpack-dev-server -D

  具體文件配置如下:

devServer: {
        contentBase: path.join(__dirname, 'dist'),
        compress: true,
        host: '0.0.0.0',
        port: 9000,
        hot: true, //是否熱更新
        proxy: { //代理
            '/api': 'http://localhost:3000'
        }
    }

  package.json中啟動命令配置如下:

"scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "start": "webpack-dev-server --mode development",
        "build": "webpack --mode production"
    }

  執行npm run start,執行結果如下:

  

  這樣開發環境我們的主要配置就完成了,但是當我們用uglifyjs壓縮es6代碼時,會發現會報錯,因為uglifyjs不能壓縮es6的代碼,此時我們需要手動配置下babel,具體步驟如下:

  1、安裝項目依賴

npm install @babel/core @babel/preset-env -D

  2、新建在項目根目錄下.babelrc文件,填入以下配置信息

{
    "presets":["@babel/preset-env"]
}

  執行npm run build,壓縮項目代碼,結果如下:

  

  全部代碼:

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const CleanWebpackPlugin = require('clean-webpack-plugin');

const config = {
    entry: './src/index.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name].[hash].min.js'
    },
    module: {
        rules: [{
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: 'style-loader',
                    use: 'css-loader'
                })
            },
            {
                test: /\.js/,
                exclude: /node_modules/, //過濾node_modules文件夾
                use: [{
                    loader: 'babel-loader'
                }]
            }
        ]
    },
    optimization: {
        splitChunks: {
            name: "vendor",
            filename: 'vendor-[hash].min.js'
        },
        minimizer: [new UglifyJsPlugin()]
    },
    plugins: [
        new HtmlWebpackPlugin({ template: './src/index.html' }),
        new ExtractTextPlugin({
            filename: 'build.min.css',
            allChunks: true,
        }),
        new webpack.BannerPlugin({
            banner: `構建時間:${new Date().getFullYear()}-${new Date().getMonth()+1}-${new Date().getDate()}`
        }),
        new CleanWebpackPlugin(),
        // new webpack.EnvironmentPlugin({ NODE_ENV: 'production' }),
        new BundleAnalyzerPlugin()
    ],
    devServer: {
        contentBase: path.join(__dirname, 'dist'),
        compress: true,
        host: '0.0.0.0',
        port: 9000,
        hot: true, //是否熱更新
        proxy: { //代理
            '/api': 'http://localhost:3000'
        }
    },
    devtool: 'source-map'
};

module.exports = config;

  參考資料:

    webpack中文網:https://www.webpackjs.com

    webpack內置插件列表:https://www.webpackjs.com/plugins/

    第三方插件可自行搜索npm:https://www.npmjs.com/

  項目源碼:

    https://github.com/gerryli0214/webpack-demo

  文筆比較粗糙,如有問題,煩請指出,謝謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 正文 pt online schema change ALTER tables without locking them. pt online schema change alters a table’s structure without blocking reads or writes. Spe ...
  • MySQL的“utf8”實際上不是真正的UTF-8。 MySQL中的“utf8”只支持每個字元最多三個位元組,而真正的UTF-8是每個字元最多四個位元組。 MySQL一直沒有修複這個bug,但是他們在2010年發佈了一個叫作“utf8mb4”的字元集,繞過了這個問題。 當然,他們並沒有對新的字元集廣而告 ...
  • 購物車是電商APP的一個關鍵功能點,一般購物車包含 3~4 個頁面,分別是: 1.購物車的商品列表頁 2.商品下單頁 3.訂單付款頁面 4.訂單付款成功頁面 由於現有購物車邏輯相對混亂,這裡重新整理一下商品下單頁的業務流程設計 1.生成訂單 這裡在業務層面把訂單的生命周期劃分為4個階段,分別是: 訂 ...
  • 程式26:給一個不多於5位的正整數。要求:一、求它是幾位數,二、逆序列印出各位數字。 var test=456; var arr=[]; arr[0]=test%10; arr[1]=parseInt(test%100/10); arr[2]=parseInt(test%1000/100); arr ...
  • 前面兩個終於把webpack相關配置解析完了。 現在終於進入vue的開發了 vue組件化開發預熱 前期準備 ...
  • React Native最近有大動作,於2019年3月12日發佈新版本0.59。主要有兩點值得升級:支持React Hooks;升級了JavaScriptCore,使Android性能有大幅提升。據用過的人說,長列表快速滑動而產生的白屏得到大大改善。這麼好的東西得趕緊體驗一下啊。 簡單的執行npm ...
  • 好久沒寫博客,從一道題目開始吧 實現一個sum函數,支持sum(1,2)和sum(1)(2)兩種調用方式 說實在的,沒啥難的,很簡單寫出來 或者用ES6的展開操作符,或者是arguments 考察的內容其實就是函數作為返回值,簡單涉及到了閉包,還有arguments的判斷,ES6展開操作符的剩餘語法 ...
  • async await的執行 註意: 本次代碼僅在 Chrome 73 下進行測試。 start 不瞭解 async await 的,先去看阮一峰老師的文章 "async 函數" 。 先來看一道 "頭條的面試題" ,這其實是考察瀏覽器的 event loop. 運行結果如下: Event Loop ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...