webpack基本使用與安裝

提供一個作者自己基于 webpack 搞好的一個下載包鹰服,可以看看https://github.com/chichengyu/webpack

介紹 webpack 之前溉瓶,我們先看看 nrm :

nrm 提供了一些最常用的NPM包鏡像地址片橡,能夠讓我們快速的切換安裝包時候的服務器地址否副;
什么是鏡像:原來包剛一開始是只存在于國外的NPM服務器撕阎,但是由于網(wǎng)絡原因热押,經(jīng)常訪問不到准浴,這時候事扭,我們可以在國內(nèi),創(chuàng)建一個和官網(wǎng)完全一樣的NPM服務器乐横,只不過句旱,數(shù)據(jù)都是從人家那里拿過來的,除此之外晰奖,使用方式完全一樣谈撒;

  1. 運行npm i nrm -g全局安裝nrm包;
  2. 使用nrm ls查看當前所有可用的鏡像源地址以及當前所使用的鏡像源地址匾南;
  3. 使用nrm use npmnrm use taobao切換不同的鏡像源地址啃匿;

注意: nrm 只是單純的提供了幾個常用的 下載包的 URL地址,并能夠讓我們在 這幾個 地址之間蛆楞,很方便的進行切換溯乒,但是,我們每次裝包的時候豹爹,使用的 裝包工具裆悄,都是 npm

網(wǎng)頁中引入的靜態(tài)資源多了以后有什么問題?臂聋?光稼?

  1. 網(wǎng)頁加載速度慢, 因為 我們要發(fā)起很多的二次請求孩等;
  2. 要處理錯綜復雜的依賴關系

而webpack可以解決上面的問題艾君,webpack 是前端的一個項目構建工具,它是基于 Node.js 開發(fā)出來的一個前端工具肄方。

webpack與gulp區(qū)別
  1. 使用Gulp冰垄, 是基于 task 任務的;
  2. 使用Webpack权她, 是基于整個項目進行構建的虹茶;
  • 借助于webpack這個前端自動化構建工具逝薪,可以完美實現(xiàn)資源的合并、打包蝴罪、壓縮董济、混淆等諸多功能。

webpack安裝

  1. 運行npm i(install) webpack -g全局安裝webpack洲炊,這樣就能在全局使用webpack的命令(npm uninstall webpack -g卸載 )
    安裝指定版本
    npm i webpack@3.3.0 -g
  2. 在項目根目錄中運行npm i webpack --save-dev安裝到項目依賴中感局,安裝webpack到項目中時的打包命令尼啡,如:
    ./node_modules/.bin/webpack ./src/main.js -o ./dist/bundle.js
    npm install webpack@3.3.0 --save-dev
    清除安裝內(nèi)存
    cnpm cache clean
    cnpm cache clean --force // 4.0以上版本
    注意:
    1.webpack4.0以后需要加上 -o 表示--output輸出的意思(如:webpack ./1.js -o ./2.js)
    2.可能還需要先 npm install webpack -D(--save-dev) 安裝后暂衡,才能進行打包
    3.當前項目根目錄還沒有 package,json文件時,使用 npm init -y 就可以生成崖瞭,不過需要注意的是狂巢,當前還沒有安裝 npm i webpack 時,必須先刪除 package,json文件书聚,當 webpack 安裝后唧领,再使用 npm init -y 生成 package.json文件,不然會報錯雌续。(如果使用了 -f(代表force)斩个、-y(代表yes),則跳過提問階段驯杜,直接生成一個新的 package.json 文件)
注意:4.0以上的且需要安裝熱替換的可以直接輸入
    npm install webpack webpack-cli webpack-dev-server --save-dev

一次性把需要的依賴安裝完受啥。
如果不成功,可單獨安裝 Webpack 開發(fā)工具

    npm install webpack-dev-server --save-dev
注意:運行熱替換 webpack-dev-server時鸽心,必須把webpack安裝到項目依賴

為了使用方便滚局,可以在package.json中的 scripts配置一些使用的命令如下:

     "scripts":{
          // 名稱:值
          // --open 表示運行命令就自動打開瀏覽器,--port 端口3000顽频,--contentBase src 打開瀏覽器后自動打開根目錄 src藤肢,--hot 可以使修改后的實現(xiàn)局部打包,同時瀏覽器自動刷新
         "dev":"webpack-dev-server --open --port 3000 --contentBase src --hot" 
      }

然后在命令行直接輸入 npm run dev 就執(zhí)行了。(--open 表示運行命令就自動打開瀏覽器糯景,--port 端口3000嘁圈,--contentBase src 打開瀏覽器后自動打開根目錄 src,--hot 可以使修改后的實現(xiàn)局部打包,同時瀏覽器自動刷新)蟀淮,
第二種配置方法
在配置文件中加入 devServer丑孩,如下:

    // 先修改 package.json中的命令 
    "scripts":{
           "dev":"webpack-dev-server" 
      }

    // 在 webpack.config.js配置文件中中加入
    const webpack = require('webpack');
    devServer:{
          open:true,// 自動打開瀏覽器
          port:3000,// 運行端口
          contentBase:'src',// 指定托管的根目錄
          hot:true// 啟動熱更新
          //但是通過日志發(fā)現(xiàn)頁面先熱更新然后又自動刷新,這和自動刷新是一樣的灭贷。 
          //如果只需要觸發(fā)HMR温学,可以再加個參數(shù)hotOnly:true,這時候只有熱更新,禁用了自動刷新功能甚疟。 
          //如果需要自動刷新就不需要設置熱更新仗岖。
          hotOnly:true// 只有熱更新逃延,禁用自動刷新功能
          //服務端壓縮是否開啟
          compress:true,
    },
    plugins:[
         //熱更新插件 new一個熱更新模塊對象
          new webpack.HotModuleReplacementPlugin(),
    ]

此時,可以安裝一個在內(nèi)存中生成 html 頁面與處理路徑的插件

npm i html-webpack-plugin -D

在 webpack.config.js 配置文件中加入如下:

const htmlWebpackPlugin = require('html-webpack-plugin');
plugins:[
    // 在內(nèi)存中創(chuàng)建一個 html 頁面的插件
    new htmlWebpackPlugin({
          // 指定模板頁面,將來會根據(jù)指定的頁面路徑去生成內(nèi)存中的頁面
          template:path.join(__dirname,'./src/index.html'),
          // 內(nèi)存中生成的頁面的名稱
          filename:'index.html'
     })
]
'html-webpack-plugin'插件的作用:

1.自動在內(nèi)存中根據(jù)指定的頁面生成一個內(nèi)存的頁面
2.自動把打包好的 bundle.js 以正確的路徑引入到頁面底部菩貌,不需要我們手動處理 bundle.js 的路徑卓鹿。

css處理安裝

包括less、scss拄丰、url路徑

npm i style-loader css-loader -D
// less-loader 內(nèi)部需要 依賴 less,所有需要安裝 less
npm i style-loader less -D
npm i style-loader less-loader -D
// sass-loader 需要 內(nèi)部依賴 node-sass俐末,所有需要安裝 node-sass
npm i style-loader node-sass -D
npm i style-loader sass sass-loader -D
// url路徑 內(nèi)部依賴 file-loader
npm i style-loader url-loader file-loader -D

Babel高級語法轉低級

// 相當于轉換工具    轉換器
npm i babel-core babel-loader babel-plugin-transform-runtime -D
// 相當于語法   語法對應插件
npm i babel-preset-env babel-preset-stage-0 -D

env 是比較新的語法料按,包含了所有和es相關的語法
在 webpack.config.js 配置文件中加入匹配規(guī)則

      module: { // 這個節(jié)點,用于配置 所有 第三方模塊 加載器 
        rules: [ // 所有第三方模塊的 匹配規(guī)則
            { 
                test: /\.js$/, // 處理以.js結尾的文件
                use:'babel-loader',   //用babel-loader處理
                exclude:/node_modules/   // exclude 排除,不需要編譯的目錄,提高編譯速度(node_modules是模塊安裝的位置,不需要編譯)
            }
        ] 
      }

然后卓箫,在創(chuàng)建一個用于babel調(diào)用的文件载矿,名為.babelrc,規(guī)范與json文件一樣不能注釋烹卒,且必須是雙引號闷盔,內(nèi)容如下:

 {
      "presets": ["env","stage-0"],
      "plugins": ["transform-runtime"]
  }

可以把 presets 理解成語法。

注意:在webpack打包前會旅急,先進行 babel 轉碼逢勾,再打包,此時因為引入了第三方包文件藐吮,有些 js 文件會報錯如下:
 bundle.js:34694 Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

造成的原因可能是再引入的包中溺拱,運用了 "caller" "callee" "argusments" 這些再嚴格模式下不能用,而 webpack 默認啟用嚴格模式炎码,所以沖突了盟迟。
解決方案:1
安裝一個插件,移除嚴格模式

// 移除嚴格模式插件
npm install babel-plugin-transform-remove-strict-mode

然后在 .babelrc 文件的 "plugins" 加入如下:

  {
      "plugins": ["transform-remove-strict-mode"],
  }

表示移除 webpack 打包時的嚴格模式潦闲。
解決方案:2
此時攒菠,我們就需要對引入的第三方包進行忽略(意思就是 不進行轉碼,只打包)歉闰,再 .babelrc 文件中,加入 .ignore 就是忽略的意思辖众, 最終如下:

  {
      "presets": ["env","stage-0"],
      "plugins": ["transform-runtime"],
      "ignore":["./src/lib/mui/js/mui.min.js"]
  }

我此處引入mui.min.js時,會報錯上面那個嚴格模式錯誤和敬,加入了這個凹炸,表示對這個文件 不轉碼,只打包昼弟,就ok了

vue包安裝

  npm i vue-loader vue-template-compiler -D

在 webpack.config.js 配置文件中啤它,加入:

  module:{
       rules:[
            { test: /\.vue$/, use:"vue-loader"}, // 配置處理 .vue組件文件的 第三方 loader 規(guī)則
       ]
  }

main.js入口文件

入口文件 main.js,內(nèi)容如下:

  // 處理 css 文件 npm i style-loader css-loader -D
  import "./src/css/index.css";
  // 處理 less 文件 npm i less-loader -D
  import "./src/css/index.less";
  // 處理 scss 文件 npm i sass-loader -D
  import "./src/css/index.scss";
  // 引入bootstrap  font 字體文件 npm i bootstrap -S
  import "bootstrap/dist/css/bootstrap.css";

webpack.config.js配置文件

在webpack.config.js對象身上,有一個model,它是一個對象变骡,在這個對象身上离赫,有個rules屬性,這個rules屬性是個數(shù)組塌碌,這個數(shù)組中存放了所有第三方文件的匹配和處理規(guī)則
為了使用方便渊胸,一般需要一個配置文件,內(nèi)容如下:

  const path = require('path');

  // 通過node中的模塊操作台妆,向外暴露了一個配置對象
  module.exports = {
      mode: 'production',
      entry:path.join(__dirname,'./src/main.js'),// 待打包的入口文件
      output:{
        path:path.join(__dirname,'./dist'),// 打包到那個目錄
        filename:'bundle.js'// 打包后的文件名稱
      },
      plugins:[
        //熱更新插件 new一個熱更新模塊對象
        new webpack.HotModuleReplacementPlugin(),
        // 在內(nèi)存中創(chuàng)建一個 html 頁面的插件
        new htmlWebpackPlugin({
            // 指定模板頁面翎猛,將來會根據(jù)指定的頁面路徑去生成內(nèi)存中的頁面
            template:path.join(__dirname,'./src/index.html'),
            // 內(nèi)存中生成的頁面的名稱
            filename:'index.html'
        })
      ],
      module: { // 這個節(jié)點,用于配置 所有 第三方模塊 加載器 
        rules: [ // 所有第三方模塊的 匹配規(guī)則
            { test: /\.css$/, use: ['style-loader', 'css-loader'] }, //  配置處理 .css 文件的第三方loader 規(guī)則
            { test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] }, //配置處理 .less 文件的第三方 loader 規(guī)則
            { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }, // 配置處理 .scss 文件的 第三方 loader 規(guī)則
            { test: /\.(jpg|png|jpeg|gif|bmp)$/, use: "url-loader?limit=7631&name=[hash:8]-[name].[ext]" }, // 配置處理 圖片路徑 文件的 第三方 loader 規(guī)則接剩,?limit限制小于7631個字節(jié)的圖片會用base64轉碼切厘,name表示還是用圖片原來的名稱且前面加上8位的hash哈希值,防止文件名稱沖突搂漠,ext還是圖片原來的后綴
            { test: /\.(ttf|eot|woff|woff2)$/, use:"url-loader"}, // 配置處理 font 字體文件的 第三方 loader 規(guī)則
            { test: /\.js$/, use:"babel-loader",exclude:/node_modules/}, // 配置處理 高級語法轉低級語法的 第三方 loader 規(guī)則
            { test: /\.vue$/, use:"vue-loader"}, // 配置處理 .vue組件文件的 第三方 loader 規(guī)則
        ] 
      },
      resolve:{
        alias:{
            // 修改 vue 被導入時的路徑   $ 表示以 vue 結尾
            "vue$":"vue/dist/vue.esm.js",
            // 給根目錄下的 src 目錄配置別名迂卢。方便引入文件
            // 注意:在模板組件中的 <style>引入樣式 需要加 ~ 波浪線
            // 如:import '~@css/style.css'
            "@": resolve("src")
        }
      }
  }

__dirname 當前運行的js文件所在的目錄某弦,配置文件一般放在根目錄下桐汤。

注意

1、在 vue-cli 腳手架中靶壮,當在 resolve 中設置了路徑別名后怔毛,在模板組件中的 <style> 中引入樣式 需要加 ~ 波浪線,如: import '~@css/style.css' 腾降。
2拣度、在 vue-cli 腳手架中,在模板組件中的 <style> 中的樣式可以穿透子組件螃壤,不受 scoped 限制抗果,如: .swiper >>> .swiper-action { color:red },>>>表示樣式穿透奸晴,表示 .swiper 里面所有子組件冤馏,出現(xiàn) .swiper-action 的都應用這個樣式

真機測試

先在電腦上下載一個熱點,比如:360wifi寄啼、獵豹無限wifi逮光,然后將手機鏈接上熱點,接著 cmd 窗口輸入 ipconfig 墩划,查看 《無限局域網(wǎng) 適配器 本地鏈接* 》這一欄涕刚,找到 《IPv4》的這個 ip地址,復制一下乙帮,然后的打開 package.json 文件杜漠,再 "dev" 后加上一項 --host 指定一下 ip(默認是localhost) 如下:

     "scripts":{
          // --open 表示運行命令就自動打開瀏覽器,--port 端口3000,--contentBase src 打開瀏覽器后自動打開根目錄 src驾茴,--hot 可以使修改后的實現(xiàn)局部打包,同時瀏覽器自動刷新戴陡,--host 指定ip地址
         "dev":"webpack-dev-server --open --port 3000 --contentBase src --hot --host 172.23.232.1" 
      }

此時,就可以在 手機上輸入 172.23.232.1 地址就能訪問到當前正在開發(fā)的項目沟涨。

webpack命令

webpack --config XXX.js //使用另一份配置文件(比如webpack.config2.js)來打包
webpack --watch //監(jiān)聽變動并自動打包
webpack -p //壓縮混淆腳本恤批,這個非常非常重要!
webpack -d //生成map映射文件裹赴,告知哪些模塊被最終打包到哪里了

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喜庞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棋返,更是在濱河造成了極大的恐慌延都,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睛竣,死亡現(xiàn)場離奇詭異晰房,居然都是意外死亡,警方通過查閱死者的電腦和手機射沟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來验夯,“玉大人猖吴,你說我怎么就攤上這事海蔽〉炒埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵借宵,是天一觀的道長幌衣。 經(jīng)常有香客問我,道長暇务,這世上最難降的妖魔是什么泼掠? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮垦细,結果婚禮上择镇,老公的妹妹穿的比我還像新娘。我一直安慰自己括改,他們只是感情好腻豌,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般吝梅。 火紅的嫁衣襯著肌膚如雪虱疏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天苏携,我揣著相機與錄音做瞪,去河邊找鬼。 笑死右冻,一個胖子當著我的面吹牛装蓬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纱扭,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牍帚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乳蛾?” 一聲冷哼從身側響起暗赶,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肃叶,沒想到半個月后蹂随,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡被环,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年糙及,在試婚紗的時候發(fā)現(xiàn)自己被綠了详幽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筛欢。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唇聘,靈堂內(nèi)的尸體忽然破棺而出版姑,到底是詐尸還是另有隱情,我是刑警寧澤迟郎,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布剥险,位于F島的核電站,受9級特大地震影響宪肖,放射性物質(zhì)發(fā)生泄漏表制。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一控乾、第九天 我趴在偏房一處隱蔽的房頂上張望么介。 院中可真熱鬧,春花似錦蜕衡、人聲如沸壤短。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽久脯。三九已至纳胧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帘撰,已是汗流浹背跑慕。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摧找,地道東北人相赁。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像慰于,于是被迫代替她去往敵國和親钮科。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

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