<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      30分鐘掌握 Webpack

      本文基于:峰華前端工程師--30分鐘掌握Webpack

      為什么使用 Webpack

      在我們進行傳統網頁開發中,會在 index.html 中引入大量的 jscss 文件,不僅可能會導致命名沖突,還會使頁面體積變大,因為如果引用了第三方庫,需要加載所有的代碼。而在 node.js 出現后,javascript 項目支持通過 require 進行模塊化開發了,并且可以利用 npm 方便地管理依賴。
      借著 node.js 和瀏覽器js 的一致性,前端項目開始在 node.js 下開發,完成之后把代碼構建成瀏覽器支持的形式。對于 reactvue 這種組件化的開發方式,因為有很多分散的文件,那么就特別需要這樣的構建操作。
      Webpack 就是進行這一步構建操作的,把 node.js 模塊化的代碼轉化為瀏覽器可執行的代碼。它提供了 importexport ES6模塊化語法的支持,然后通過分析代碼中 import 導入的依賴,把需要的代碼加載進來。在 Webpack 中,任何文件都可以通過 import 導入,只要有對應的 loader 就可以了。在打包過程中,還可以通過插件來干預打包過程,例如剔除不必要的代碼,形成體積更小的項目。

      創建項目

      • 打開命令行工具,我們在這里創建一個名為 blog 的博客項目:

        mkdir blog
        cd blog
        yarn init -y
          (或者npm init)
        
      • 添加 webpack 依賴:

        yarn add webpack webpack-cli --dev
        
      • 使用 VSCode 打開項目:

        code .
        

      初出茅廬

      • blog 項目下新建 src 文件下,創建 index.js

        console.log("Hello World");
        

        我們先只做一個簡單的輸出.

      • blog 項目下新建 index.html

        <!DOCTYPE html>
        <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Document</title>
        </head>
        <body>
          <h1>Hello World</h1>
          <script src="./dist/index.js"></script>
        </body>
        </html>
        
      • 使用 LiveServer 查看剛剛所編寫的 html頁面:

        可以看到瀏覽器成功顯示了 "Hello World",并且控制臺也能夠成功輸出.

      • 嘗試使用 webpack 打包

        打開控制臺,輸入 npx webpack

      npx 能夠直接運行 node_modules 下面安裝的庫的自帶的命令行,而不用寫 node_modules 下一串的絕對路徑。

      打包完成后可以看到項目里面生成了一個 dist 目錄,里面有一個 main.js 文件,其內部的內容和我們剛剛所編寫的 index.js 的文件一模一樣,這是因為我們并沒有使用任何 import 來導入其他的依賴。

      使用 import 導入依賴

      • src 下新建一個 data.js 文件:

        export function getBlogPosts() {
          return ["博客1", "博客2", "博客3"];
        }
        
      • index.js 中導入 data.js 中的函數并調用:

        import { getBlogPosts } from "./data";
        
        console.log(getBlogPosts());
        
      • 重新使用 webpack 打包一下,查看結果:

        npx webpack
        

        現在進入 /dist/main.js 中看一下,代碼被簡化成了直接輸出剛才我們所編寫的數組的語句,說明 webpack 自動判斷了我們所編寫代碼的邏輯,并通過 import 語句得到了我們所引入的代碼,分析后生成新的 js 文件.

      • 在網頁中查看下結果:

        成功地輸出了數組.

      Webpack 配置文件

      webpack 的配置文件可以說是 webpack 最核心的部分了,我們可以在配置文件中修改入口和出口文件、通過 loader 加載不同類型的文件和使用 plugins 對代碼做其他的操作。

      嘗試修改打包后生成文件的名稱

      • 在項目中新建 webpack.config.js 文件:

        const path = require("path");
        
        module.export = {
          mode: "development",
          // 設置為開發模式,方便調試
          entry: "./src/index.js",
          output: {
            filename: "dist.js",
            path: path.resolve(__dirname, "dist"),
            // 設置文件名和目錄
          }
        }
        
      • 執行 npx webpack 命令打包

        可以看到 dist 文件夾下多了個 dist.js 文件.

      使用模塊化語法

      • 修改 /index.htmlscript 標簽:

        <script src="./dist/dist.js"></script>
        

        main.js 修改成為我們剛剛使用 webpack 打包生成的 dist.js

      • 修改 /src/index.js 文件,將之前編寫的數組變成 ul 元素插入頁面中:

        const blogs = getBlogPosts();
        
        const ul = document.createElement("ul");
        blogs.forEach(blog => {
          const li = document.createElement("li");
          li.innerText = blog;
          ul.appendChild(li);
        })
        
        document.body.appendChild(ul);
        
      • npx webpack

        列表成功插入到了頁面.

      引入 css

      • src 下新建 style.css 文件:

        h1 {
          color: blueviolet;
        }
        

        這里只是簡單地改變 h1 標簽的顏色.

      • /src/index.js 中引入 css 文件:

        import "./style.css";
        
      • 安裝 loader

        打開控制臺,輸入:

        yarn add --dev style-loader css-loader
        
      • webpack.config.js 中配置 loader

        module.exports = {
          mode: "development",
          output: {...},
          ...
        
          module: {
            rules: [{
              test: /\.css$/i,
              use: ["style-loader", "css-loader"],
            }]
          }
        }
        

        module -> rules -> test 內是一個正則表達式,表示以 .css 結尾的文件.
        use 屬性下是所使用的 loader

      • 再次使用 npx webpack 打包:

        可以看到,剛才寫的樣式生效了.

      加載圖片

      • webpack 原生支持圖片等靜態文件,但是需要在 webpack.config.js 中編寫配置:

        module.exports = {
          ...
          module: {
            rules: [
            ...
            {
              test: /\.(png|svg|jpg|jpeg|gif)$/i,
              type: "assets/resource",
            }]
          }
        }
        
      • src 下載新建 assets/ 文件夾,放入一張圖片:

      • index.js 中引入圖片:

        import AbcImage from "./assets/abc.png"
        
        ...
        
        const image = document.createElement("img");
        image.src = AbcImage;
        
        document.body.prepend(image);
        
      • npx webpack

      自動生成 HTML

      上述的例子中,我們只是使用 webpack 來打包 jscss 文件,并手動的導入編寫好的 html 中,使用下面的插件,就可以自動為我們生成 HTML 文件。

      • 安裝插件:

        yarn add html-webpack-plugin --dev
        
      • 使用插件:

        const HtmlWebpackPlugin = require("html-webpack-plugin");
        ...
        
        plugins: [new HtmlWebpackPlugin({
          title: "博客列表",
          // 這里可以自定義網頁的標題
        })],
        
      • npx webpack

        可以看到生成了和剛才相同的頁面

        使用 webpack 打包出來的網頁沒有顯示 <h1>Hello World</h1> 的原因是 這個標簽是我們自己寫的??

      • 定義打包好 html 文件的網頁標題

        我們使用 html-webpack-plugins 打包生成的文件名默認是 Webpack App,其實網頁標題是可以在插件內傳遞參數來更改的:

        plugins: [new HtmlWebpackPlugin({
          title: "博客列表",
        })],
        

      Babel

      有時我們的代碼可能需要運行在更低版本的瀏覽器上,這些瀏覽器可能并不支持我們所寫的更高級的代碼,這時就需要用到 babel 轉譯工具來使我們的代碼變成瀏覽器能夠識別的代碼。

      • 安裝 babel-loader 相關依賴:

        yarn add --dev babel-loader @babel/core @babel/preset-env
        
      • webpack.config.js 中添加配置:

        rules: [
        ...
        {
          test: /\.js$/, // 識別js為結尾的文件
          exclude: /node_modules/, //不解釋node_modules/下的文件
          use: {
            loader: "babel-loader",
            options: {
              presets: ["@babel/preset-env"]
            }
          }
        }]
        

        這里可以在 module.exports 下配置 devtool="inline-source-map" 方便查看打包后的源碼

      • 使用 npx webpack 重新打包下,進入 dist/dist.js 查看相關代碼:

        /* 打包前的 */
        blogs.forEach(blog => {
          const li = document.createElement("li");
          li.innerText = blog;
          ul.appendChild(li);
        })
        
        blogs.forEach(function (blog) {
          var li = document.createElement("li");
          li.innerText = blog;
          ul.appendChild(li);
        });
        

        可以看到 箭頭函數已經被轉換成了 .forEach 的形式,增強了對低版本瀏覽器的兼容性。

      使用 Terser 插件壓縮打包后的代碼

      • 安裝插件:

        yarn add --dev terser-webpack-plugin
        
      • 配置:

        // webpack.config.js
        const TerserPlugin = require("terser-webpack-plugin");
        
        module.exports = {
          ...
          optimization: {
            minimize: true,
            minimizer: [new TerserPlugin()],
          },
        }
        
      • 打包: npx webpack

        可以看到我們打包生成的 js 文件都被緊密地寫在了一起,右鍵屬性查看文件大小也要比之前的小一些。??

      使用 DevServer 插件自動打包

      • 安裝:

        yarn add -dev webpack-dev-server
        
      • 配置:

        module.exports = {
        ...
          devServer: {
            static: "./dist",
          },
        }
        

        為了我們以后方便運行開發服務器,還需要在 package.json 里添加一個 script

        {
          ...
          "scripts": {
            "start": "webpack serve --open"
          },
        }
        
      • 啟動服務器:

        yarn start
        // 或
        npm run start
        
      • 嘗試一下 "熱更新?"

        index.js 下添加如下代碼:

        const header1 = document.createElement("h1");
        header1.innerText = "Hello";
        document.body.appendChild(header1);
        
      • 保存,查看網頁

        這里不再使用 VsCodeLive Server 插件了,而是在瀏覽器地址欄輸入命令行中輸出的地址:

        成功!??

        那么 webpack 是如何實現熱更新的呢?其實是在我們每次保存時,插件自動生成新的 dist.js 并把之前的 dist.js 寫入緩存,這或多或少會增加我們電腦的開銷。但 webpack 貼心的為我們想到了這一點。

      • 每次打包生成新的 /dist.js

        配置 webpack.config.js

        output: {
          filename: "[name].[contenthash].js",
          // name 默認為 main
          path: path.resolve(__dirname, "dist"),
        },
        

        更改下 index.js 代碼,運行 npx webpack

        可以看到生成了文件后綴名不同的文件,這樣可以避免由于瀏覽器緩存機制而導致更新不及時的問題。

      配置目錄別名:

      和之前寫的 http://www.rzrgm.cn/hhsk/p/16460701.html 大同小異

      • 配置:
        // webpack.config.js
        module.exports = {
        ...
          resolve: {
            alias: {
              assets: path.resolve(__dirname, "src/assets")
            }
          }
        }
        
      posted @ 2022-09-26 23:15  HuStoking  閱讀(157)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲精品tv久久久久久久久久| 性欧美暴力猛交69hd| 亚洲色成人网站www永久四虎| 亚洲av伊人久久综合性色| 中文字幕精品亚洲字幕成| 中文日产幕无线码一区中文| 国产精品午夜福利合集| 国产精品免费久久久免费| 免费无码黄十八禁网站| 天天爱天天做天天爽夜夜揉| 色呦呦九九七七国产精品| 深夜福利资源在线观看| 日韩精品亚洲精品第一页| 99RE8这里有精品热视频 | 亚洲中文字幕人成影院| 午夜免费国产体验区免费的| 麻江县| 亚洲欧美日韩综合一区二区| 日韩中文字幕精品人妻| 香蕉久久精品日日躁夜夜躁夏| 亚洲高请码在线精品av| 亚洲男人av天堂久久资源| 欧美国产综合视频| 94人妻少妇偷人精品| 国产免费高清69式视频在线观看 | 在线天堂最新版资源| 安达市| 亚洲老熟女一区二区三区| 欧美综合婷婷欧美综合五月| 4hu亚洲人成人无码网www电影首页 | 玩两个丰满老熟女久久网| 亚洲成人午夜排名成人午夜| 久热这里只有精品12| 欧美在线观看www| 老熟妇老熟女老女人天堂| 女人色熟女乱| 精品中文人妻中文字幕| 久热这里只有精品视频3| 午夜福利精品国产二区| 亚洲中文字幕日产无码成人片| 日韩欧美一卡2卡3卡4卡无卡免费2020|