webpack從零開始搭建多頁面(一):webpack起步到執行一個簡單的demo

平平不平發表於2019-02-16

搭建webpack_demo1專案,使其執行起來

webpack的強大就不介紹了,我們直接動手做起來,我們從零開始一步步搭建一個多頁面的系統,多參考webpack中文文件

cmd命令:

mkdir webpack_demo1             #建立資料夾
cd webpack_demo1                #進入資料夾
npm install -g webpack          #全域性安裝webpack
npm init                        #初始化
npm install --save-dev webpack  #安裝webpack包

可以安裝淘寶映象 $ npm install -g cnpm –registry=https://registry.npm.taobao.org 上面的npm就可以寫成cnpm

demo1的目錄:


|——node_modules
├─dist           # 打包後的檔案
|   ├─greeter.js #就放了一句話
|   |──main.js   #入口檔案
├─src            #當前專案的原始碼
|   ├─greeter.js #就放了一句話
|  |──main.js    #入口檔案
|——webpack.config.js #webpack配置檔案
|——package.json      #依賴包
1、建專案目錄並完成第一次打包

進入上我們建立的webpack_demo1目錄,建立兩個資料夾,分別是src資料夾和dist資料夾:

src資料夾:用來存放我們編寫的javascript程式碼,可以簡單的理解為用JavaScript編寫的模組。

dist資料夾:用來存放供瀏覽器讀取的檔案,這個是webpack打包成的檔案。

可以理解成src是原始碼檔案,dist是我們編譯打包好的檔案;一個用於開發環境,一個用於生產環境。

在dist檔案下手動建立一個index.html檔案,並寫入下面的程式碼。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>webpack_demo1</title>
</head>
<body>
    <div id="root"></div>
    <script src="./bundle.js"></script>
</body>
</html>

在src資料夾下建立main.js和greeter.js,編寫我們的JavaScript程式碼,main.js是我們的入口檔案。

在main.js檔案裡寫: 
    const greeter=require(`./greeter.js`);
    document.getElementById(`root`).innerHTML = greeter();
在greeter.js檔案裡寫:  
    module.export = function(){
        return `第一個webpack demo`;
    };

  • 第一次打包

在終端下 寫命令:webpack “entry file” “destination for bundled file”

entery file: 入口檔案的路徑,這裡就是src/main.js

destination for bundled file: 填寫打包後存放的路徑,這裡就是dist/bundle.js

所以終端寫:webpack src/entry.js dist/bundle.js(webpack非全域性安裝執行:node_modules/.bin/webpack src/main.js dist/bundle.js)

成功後,在dist資料夾下會出現一個bundle.js

2、通過配置檔案來使用Webpack打包

在根目錄下新建一個名為webpack.config.js的檔案,

標準的webpack配置模板:
     module.exports={
        
         entry:{}, //配置入口檔案的地址,可以是單一入口,也可以是多入口。
        
         output:{}, //配置出口檔案的地址,在webpack2.X版本後,支援多出口配置。
         
         module:{},//配置模組:主要是解析CSS和圖片轉換壓縮等功能。
         
         plugins:[],//配置外掛,用於生產模版和各項功能
        
         devServer:{} //配置webpack開發服務功能
     }
     

我們在其中寫入如下所示的簡單配置程式碼: 入口檔案路徑/打包後檔案的存放路徑:


    const webpack = require(`webpack`);
    const path = require(`path`);
    module.exports = {
        entry:  __dirname + "/src/main.js",//已多次提及的唯一入口檔案
        output: {
            path: __dirname + "/dist",//打包後的檔案存放的地方
            filename: "bundle.js"//打包後輸出檔案的檔名
        },
        module:{},
    
        plugins:[],
    
        devServer:{}
    };
    //__dirname”是node.js中的一個全域性變數,它指向當前執行指令碼所在的目錄。
    
  • 第二次打包 (先刪掉dist中已有的bundle.js)

在終端下 寫命令:webpack(wepack非全域性安裝執行:node_modules/.bin/webpack)

成功後,在dist資料夾下會出現一個bundle.js

3、更快捷的執行打包

在命令列中輸入命令”node_modules/.bin/webpack”這樣的操作是比較煩人的,不過值得慶幸的是npm可以引導任務執行,
對npm進行配置後可以在命令列中使用簡單的npm start命令來替代上面略微繁瑣的命令:


在package.json中對scripts物件新增一條下命令:"start": "wepack"

注意:package.json中的script會安裝一定順序尋找命令對應位置,本地的node_modules/.bin路徑就在這個尋找清單中,所以無論是全域性還是區域性安裝的Webpack,都不需要寫前面那指明詳細的路徑了。

  • 第三次打包:(先刪掉dist中已有的bundle.js)

在命令列中輸入:npm start
成功後,在dist資料夾下會出現一個bundle.js

使用webpack構建本地伺服器
讓瀏覽器監聽你的程式碼的修改,並自動重新整理顯示修改後的結果: 

在終端輸入:npm install --save-dev webpack-dev-server

在package.json中對scripts物件新增一條下命令用以開啟本地伺服器: "server": "webpack-dev-server --open"

在webpack.config.js中新增devServer:


 devServer:{
    contentBase:path.resolve(__dirname,`dist`), //設定基本目錄結構,本地伺服器所載入的頁面所在的目錄
    host:`localhost`,//伺服器的IP地址,可以使用IP也可以使用localhost
    inline: true,//實時重新整理
    compress:true,//服務端壓縮是否開啟,一般設定為開啟,
    historyApiFallback: true,//不跳轉
    port:1818 //配置服務埠號,建議不使用80,很容易被佔用,這裡使用了1818
 }
 

在頁面上已經可以看到一句話了” 第一個webpack demo “;

關於入口和出口配置的寫法及其解釋

entry入口:

單入口有以下寫法:
    entry:  __dirname + "/src/main.js",
    entry:  `./src/main.js`,
多入口有以下寫法:
    entry:{
       index: `./src/main.js`,
       selectList:`./src/***.js`
     },
     

output出口:

output: {
    path: __dirname + "/dist",//打包後的檔案存放的地方
    // path:path.resolve(__dirname,`dist`),
    filename: "bundle.js"//打包後輸出檔案的檔名
    //filename:`[name].js`
    // filename:`js/[name].js`
    // filename:`js/[name].bundle-[chunkhash:8].js` 
},

filename: "[name].js"
filename: "[name]-[hash].js"
    打包檔名: main.js
                main-6672c04f6c9672410a61.js
                
filename:`js/[name].js`:
    打包目錄是:|——dist
               |    |——js
               |    |   |——main.js
  
filename:`js/[name].bundle-[chunkhash:8].js` :
      打包目錄是:|——dist
                 |    |——js
                 |    |   |——main.bundle-d0dea2df.js
                 
[name]:是根據入口檔案的名稱,打包成相同的名稱,有幾個入口檔案,就可以打包出幾個檔案。

[chunkhash:8]: 數字和字母組成的8位雜湊值

 __dirname:是node.js中的一個全域性變數,它指向當前執行指令碼所在的目錄,列印出來是:webpackwebpack_demo1
 
 path:使用Node內建的path模組,並在它前面加上__dirname這個全域性變數。
      可以防止不同作業系統之間的檔案路徑問題,並且可以使用相對路徑按照預期工作。
         

建議使用:filename:`js/[name].bundle-[chunkhash:8].js`:


可以通過命中快取,以降低網路流量,使網站載入速度更快,
然而,如果我們在部署新版本時不更改資源的檔名,瀏覽器可能會認為它沒有被更新,
就會使用它的快取版本。由於快取的存在,當你需要獲取新的程式碼時,就會顯得很棘手。         

關於快取:看文件

相關文章