webpack的基本使用及配置

前言:

拿到一個項目 , 生成默認package.json,可以執(zhí)行npm init -y
package.json中dependencies和devDependencies的部分都會被安裝,區(qū)別在于前者用于生產(chǎn)環(huán)境,后者用于開發(fā)環(huán)境
-g 表示全局安裝,通常用于安裝腳手架等工具
-save(-S) 表示本地安裝,會被加至dependencies部分 eg: npm i jquery -S 安裝jquery包
-save-dev(-D) 表示本地安裝,會被加至devDependencies部分 eg: cnpm i webpack-dev-server -D (實現(xiàn)自動打包編譯)
什么都不加也會安裝,但是不會加至package.json中

開始:

拿到一個項目之后:::

  • 第一步:
    package-json.png

新建文件夾, 用 npm 的包管理工具 管理起來 ( 命令行輸入 npm init -y ) 文件里出現(xiàn) package.json
如果文件名有 中文 , 命令行輸入 npm init 不需要 -y 回車 會重新讓寫一個名字

  • 第二步:
    創(chuàng)建兩個 文件夾 src ( 存放項目源代碼的 ) 和 dist ( 項目打包之后輸出的文件放到dist里邊 )
    1. 在src 里 新建 index.html 項目首頁
    2. 然后 在src 里 建一個 main.js , 這是項目的 JS 入口文件
    在 main.js 先console.log 一句話 接下來我們要 嘗試著 把main.js 打包一下 然后 引入到 index.html 里面 ,看我們這個 能不能正常 打包 ( 命令行輸入 webpack ./src/main.js ./dist/bundle.js ) → dist文件夾 有了 bundle.js
    3. 如果 我們把 dist文件夾 刪掉 命令行運行 webpack ./src/main.js ./dist/bundle.js 也會自動生成 dist文件夾
    4. 在 index.html 用 script標簽 引入 ../dist/bundle.js 運行瀏覽器右鍵查看 console.log出了 你好

    每次修改了一些代碼 都需要手動重新運行  webpack ./src/main.js ./dist/bundle.js,體驗不好
          我們想要  自動打包  怎么辦呢?
    
    • 第一步:
      安裝工具 , ( 命令行 輸入 cnpm i webpack-dev-server@2.9.7 -D ) 實現(xiàn)自動打包編譯的 功能
    • 第二步:
      裝完之后 , 需要在 項目根目錄新建一個 webpack的 配置文件 叫 : webpack.config.js ( 裝完之后, 命令行 提示 dev-server 依賴于 webpack, 需要項目本地 安裝webpack )
    • 第三步:
      安裝本地 webpack , ( 命令行輸入 cnpm i webpack@3.10.0 -D ) 此處 ,安裝了指定webpack版本 , 避免與webpack-dev-server沖突

    寫一下 配置文件 在webpack.config.js中

    1. const path = require('path') //由于 webpack是 基于node進行構(gòu)建的 , 所以, webpack的配置文件中 ,任何 合法的 node 代碼 都是支持的
    2. 向外 暴露 一個 配置對象:
      module.exports = { } 當以命令行 形式 運行 webpack 或 webpack-dev-server 的時候, 工具會發(fā)現(xiàn) , 我們并沒有提供 要打包的 文件的 入口 和 出口文件 , 此時 ,他會檢查項目根目錄中的 配置文件 , 并 讀取這個文件 , 就拿到了 導(dǎo)出的 這個 配置對象 , 然后 根據(jù)這個 對象 , 進行打包 構(gòu)建
      (1.) 指定入口文件 :entry: path.join(__dirname,'./src/main.js')
      (2.) 通過 output 指定 輸出選項 output: { }
      output: {
          path: path.join(__dirname, './dist'),
          filename: 'bundle.js'
      }
    
    1. 配置完成后 , 命令行 輸入 webpack 打包 , 此時并沒有實現(xiàn) 實時打包
    2. 如果 我們要 利用 dev-server 這個 工具 實時打包的話 , 需要在 package.json里 添加一個 腳本 , 在
      scripts: { } 里 再添加一個指令: "dev": "webpack-dev-server"
    • webpack-dev-server的配置參數(shù)
webpack-dev-server配置參數(shù).png
     (1.)  自動打開瀏覽器  --open"  
     (2.)  設(shè)置啟動時的默認端口  --port 3000
     (3.)  指定托管的 根目錄   --contentBase src
     (4.)  啟動熱更新   --hot
  1. 命令行 輸入 npm run dev 右鍵審查 報錯 頁面里的 bundle.js 路徑不對
    第一種: 把頁面里的 ../dist/bundle.js 路徑 改為 : /bundle.js
    第二種: 注釋掉 <script type="text/javascript" src="/bundle.js"></script>
    用 html-webpack-plugin來實現(xiàn) 他為我們 在內(nèi)存中生成 一份 一模一樣的頁面 , 并且會 自動 把 bundle.js 注入到 頁面底部 我們不需要再手動 處理 bundle.js 的引用路徑
  2. 命令行 安裝 cnpm i html-webpack-plugin -D
  3. 在 配置文件中 , 引入 const htmlWebpackPlugin = require('html-webpack-plugin')
  4. 插件引入進來了 , 如果要 配置插件 , 需要在 導(dǎo)出的 對象中, 掛載一個 plugins 節(jié)點 , plugins是一個數(shù)組, 和output平級 , 配置 一個 plugins:[ ] <plugins是所有 webpack 插件的 配置節(jié)點>, 然后 new一下 htmlWebpackPlugin
plugins: [
    new htmlWebpackPlugin({ 
        template: path.join(__dirname,'./src/index.html'), 
        filename: 'index.html'
    })
]
***** 如果 想要 引入 css 樣式:

新建 index.css

  1. 我們可以在index.html link一下css文件, 但是這樣會發(fā)起 請求 ; ( 不贊同這種方式 )
  2. 我們可以在 main.js 里 , import 一下 eg: import './css/index.css' 保存 會報錯, 提示我們 webpack 處理不了這種類型的文件 , 需要我們 安裝 loader
  3. 安裝 處理樣式表的 loader : ( 命令行輸入 cnpm i style-loader css-loader -D )
  4. 然后 我們需要 添加一下 配置節(jié)點 module 節(jié)點 module: { rules: [ 處理css文件的loader ] }
    { test: /\.css$/, use: ['style-loader', 'css-loader'] } //處理 css文件的 loader
***** 如果 想要 引入 less 文件:

命令行安裝 cnpm i less-loader less -D
{ test: /\.less$/, use: ['style-loader', 'css-loader','less-loader'] } //處理 less文件的 loader

***** 如果 想要 引入 scss 文件:

命令行安裝 cnpm i sass-loader node-sass -D
{ test: /\.scss$/, use: ['style-loader', 'css-loader','sass-loader'] } //處理 scss文件的 loader

若我們 想在 css 里 寫一個 背景圖片 eg: background: url(../images/cat2.jpg) no-repeat;
保存 報錯 , 也就是說 默認情況下 , webpack 無法幫我們處理 css 文件中的 url 地址 不管是 圖片 還是 字體庫 , 只要是 url 地址 都處理不了

解決辦法:
  • 第一步:
    安裝 url-loader , 同時 url-loader 也需要依賴于 它內(nèi)部的 file-loader
    ( 命令行 輸入 cnpm i url-loader file-loader -D )
  • 第二步:
    在配置文件中 ,配置一下 { test: /\.(jpg|png|gif|bmp|jpeg)$/, use: 'url-loader' } //處理 圖片路徑的 loader
  • 第三步:
    npm run dev 運行 右鍵審查 發(fā)現(xiàn) background: url 地址里 自動轉(zhuǎn)成了 base64 格式的 背景圖, 這樣可以避免多次請求 , 但是 我們有時候, 一些小圖可以轉(zhuǎn)成 base64的 , 有些大圖 不想讓轉(zhuǎn)成 base64格式 怎么辦呢???
  • 第四步:
    在配置文件中 , 找到 url-loader 加參數(shù) , 和 url地址傳參一樣 url-loader 有一個固定的 參數(shù) limit , 后邊跟的是 圖片的 字節(jié)數(shù)
    eg: { test: /\.(jpg|png|gif|bmp|jpeg)$/, use: 'url-loader?limit=19898' }, //處理 圖片路徑的 loader
    1.) 如果limit 后邊給定的值 , 大于圖片本身的字節(jié)數(shù)時, 會把圖片進行base64編碼
    2.) 如果limit 后邊給定的值 , 等于或者小于圖片本身的字節(jié)數(shù)時, 則不會 轉(zhuǎn)為 base64的字符串, 但是 圖片路徑為 數(shù)字和字母組成的 避免重復(fù)的名字 , 如果不想改名, 我們傳的什么名字的圖片, 打包完還要那個名字的 , 怎么辦呢?
  • 第五步:
    配置文件url-loader 傳入第二個參數(shù) name=[name].[ext]
    eg: { test: /\.(jpg|png|gif|bmp|jpeg)$/, use: 'url-loader?limit=19898&name=[name].[ext]' }, //處理 圖片路徑的 loader
    [name]是指: 之前是什么名兒, 還是什么名 [ext] 打包前是什么后綴名, 還是什么后綴名
    • 如果src 里 建立兩個文件夾: images images2 里邊各有一張 圖片名 cat.jpg 的 圖片 此時, 瀏覽器里 兩個div的背景圖 會顯示同一張cat.jpg的圖片 因為他們的名字一樣 為避免這種情況 我們可以在 [name] 前再加一個 參數(shù) 哈希值
      eg: { test: /\.(jpg|png|gif|bmp|jpeg)$/, use: 'url-loader?limit=19898&name=[hash:8]-[name].[ext]' }, //處理 圖片路徑的 loader
      [hash:8] 表示 要截取哈希的前8位放到圖片名字前, 哈希值最大可以設(shè)置32位
***** 針對處理一些更高級的 ES6與ES7語法:

在 webpack 中 , 默認只能處理 一部分 ES6的 新語法 , 一些 更高級的 ES6語法 或者 ES7語法 , webpack是處理不了的 , 這時候 , 就需要 借助于 第三方 loader 來幫助 webpack 處理這些 高級的 語法 , 當 第三方loader 把 高級語法 轉(zhuǎn)為 低級的語法之后 , 會把結(jié)果 交給 webpack 去打包 到 bundle.js 中

解決方法:

通過Babel , 可以 幫我們 將 高級的 語法轉(zhuǎn)為 低級的 語法

  • 1. 在 webpack 中 , 可以運行 如下的 兩套命令 , 安裝 兩套包 , 去 安裝 Babel 相關(guān)的 loader功能
    • 1.1 第一套包: cnpm i babel-core babel-loader@7.1.5 babel-plugin-transform-runtime -D ;
    • 1.2 第二套包: cnpm i babel-preset-env babel-preset-stage-0 -D ;
  • 2. 打開 webpack 的 配置文件, 在 module 節(jié)點下的 rules 數(shù)組中 , 添加 一個 新的 匹配規(guī)則
    • 2.1 { test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }

    • 2.2 注意: 在配置 babel 的 loader 規(guī)則的時候 , 必須把 node_modules 目錄, 通過 exclude 選項 排除掉
      原因有 :

      • 2.2.1 如果 不排除 node_modules , 則 babel 會把 node_modules 中 所有的 第三方 JS 文件 , 都打包 編譯 , 這樣 , 會非常 消耗 CPU , 同時 , 打包速度 非常慢 ;
      • 2.2.2 哪怕, 最終 babel 把 所有的 node_modules 中的 JS 轉(zhuǎn)換完畢了 , 但是 項目也 無法正常 運行
  • 3. 在項目的 根目錄中 , 新建一個 叫做 .babelrc 的 Babel 配置文件, 這個 配置文件 屬于 JSON格式 , 所以 在寫 .babelrc 配置的 時候 , 必須符合 JSON 語法規(guī)范 : 不能寫注釋 , 字符串 必須用 雙引號
    • 3.1 在 .babelrc 寫如下的 配置: presets: 可以翻譯成 語法的意思 plugins: 插件
      babelrc文件.png
        {
            "presets": ["env", "stage-0"],
            "plugins": ["transform-runtime"]
        }
***** 默認, webpack 無法打包 .vue 文件 , 需要安裝相關(guān)的 loader:
  1. cnpm i vue-loader vue-template-compiler -D
  2. 在配置文件中 , 新增 loader 配置項 { test:/\.vue$/, use: 'vue-loader' }
***** 總結(jié)梳理: webpack中 如何使用 vue
  1. 安裝 vue 的包: cnpm i vue -S
  2. 由于 在 webpack中 , 推薦使用 .vue 這個組件模板文件定義組件 , 所以 , 需要安裝 能解析這種文件 的 loader , cnpm i vue-loader vue-template-compiler -D
    3.在 main.js 中 , 導(dǎo)入 vue 模塊 import Vue from 'vue'
  3. 定義一個 .vue 結(jié)尾的 組件, 其中 組件由三部分組成 : template script style
  4. 使用 import 導(dǎo)入這個組件 import login from './login.vue'
  5. 創(chuàng)建 vm實例 var vm = new Vue({ el: '#app', render: c => c(login) })
  6. 在頁面中 創(chuàng)建 一個 id 為 app 的 div元素 , 作為我們 vm 實例 要控制 的 區(qū)域
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內(nèi)容