vue2.0學(xué)習(xí)04之vue-cli的解析

一直想寫webpack的知識(shí)點(diǎn),卻發(fā)現(xiàn)webpack其實(shí)要將webpack說的具體內(nèi)容還是挺多的秘噪。而且網(wǎng)上上一搜webpack有好多人都有去寫webpack的知識(shí)點(diǎn)缆娃,所以本文中不再去重復(fù)別人的東西了贯要,就簡單記錄一下我對(duì)webpack的理解椭住。

一京郑、什么是webpack

1. webpack是什么些举?

webpack是一個(gè)模塊打包工具。
用vue項(xiàng)目來舉例:瀏覽器它是只認(rèn)識(shí)js驶臊,不認(rèn)識(shí)vue的关翎。而我們寫的代碼后綴大多是.vue的纵寝,在每個(gè).vue文件中都可能html星立、js绰垂、css甚至是圖片資源辕坝;并且由于組件化荐健,這些.vue文件之間還有錯(cuò)綜復(fù)雜的關(guān)系。所以項(xiàng)目要被瀏覽器識(shí)別窖逗,我們就要使用webpack將它們打包成js文件以及相應(yīng)的資源文件碎紊。
或者這么理解仗考,我們以vue項(xiàng)目的形式編寫項(xiàng)目邏輯词爬,瀏覽器以他理解的方式來運(yùn)行項(xiàng)目顿膨。webpack把我們的vue項(xiàng)目想表達(dá)的所有意圖傳遞給瀏覽器讓瀏覽器去運(yùn)行恋沃。
PS:webpack功能不止于此囊咏,但這個(gè)功能是讓我們項(xiàng)目能跑起來的必要條件!(個(gè)人理解研侣,如有錯(cuò)誤庶诡,還請(qǐng)批評(píng)指正)

2. 來個(gè)demo理解下

這里我們來理解下webpack是如何打包的~(轉(zhuǎn)譯會(huì)在loaders中提到)末誓。首先我們寫兩個(gè)最簡單的js
hello.js

console.log("hello~~")

app.js

console.log("hello app");
require("./hello.js")

app.js中導(dǎo)入了hello.js喇澡,它們之間有導(dǎo)入關(guān)系晴玖。我們假如直接將app.js放到html中是會(huì)報(bào)錯(cuò)的呕屎。

hello app
Uncaught ReferenceError: require is not defined at app.js:2

如果我們要維持這種關(guān)系我們就必須使用打包工具進(jìn)行打包。在命令行中輸入:

// 安裝webpack
$ npm install webpack -g
// 打包app.js
$ webpack app.js bundle.js

然后我們會(huì)發(fā)現(xiàn)項(xiàng)目中多了一個(gè)bundle.js文件尔当,我們?cè)趆tml中導(dǎo)入這個(gè)js文件椭迎。
index.html

<!DOCTYPE html>
<html>
  <head>
    <title>demo01</title>
  </head>
  <body>
    <h1>demo01</h1>
    <script src="bundle.js"></script>
  </body>
</html>

最后輸出正確結(jié)果

hello app
hello~~

二畜号、webpack.config.js

1. 定義

webpack.config.js文件是webpack的默認(rèn)配置文件弄兜。之前我們使用命令行$ webpack entry.js output.js來實(shí)現(xiàn)打包替饿,其實(shí)webpack可以有更多的打包配置贸典,這些配置都是在webpack.config.js中完成的廊驼。下面是一個(gè)簡單的webpack.config.js妒挎。

const webpack = require("webpack")

module.exports = {
  entry: {
    entry: "./app/entry.js",
  },
  output:
  {
    path: __dirname + "/dist",
    filename: 'bundle.js',
  },
  module: {
    loaders: [
      {
        test: /\.js$/,
        loader: 'babel',
        exclude: /node_modules/
      },
    ]
  }
}

個(gè)人覺得這三個(gè)東西是最最重要的了,所以必須單獨(dú)說說這三個(gè)配置酝掩。其他配置都可以去查閱資料慢慢來鳞芙。

2. entry&output

entry是配置webpack的入口文件,上面的代碼中我們將app目錄下的entry.js作為入口文件期虾。webpack會(huì)將與entry.js有關(guān)的資源都進(jìn)行打包原朝。
output是出口文件,即打包好的文件的存放地址和文件名镶苞。

這里有幾種文件的輸入輸出情況喳坠。引用自Webpack 2 入門教程

2.1 單文件茂蚓,單輸出

const webpack = require("webpack");
module.exports = {
  context: __dirname + "/src",
  entry: {
    app: "./app.js",
  },
  output: {
    path: __dirname + "/dist",
    filename: "[name].bundle.js",
  },
};

2.2 多文件剃幌,單輸出

const webpack = require("webpack");
module.exports = {
  context: __dirname + "/src",
  entry: {
    app: ["./home.js", "./events.js", "./vendor.js"],
  },
  output: {
    path: __dirname + "/dist",
    filename: "[name].bundle.js",
  },
};

2.3 多文件,多輸出

const webpack = require("webpack");
module.exports = {
  context: __dirname + "/src",
  entry: {
    home: "./home.js",
    events: "./events.js",
    contact: "./contact.js",
  },
  output: {
    path: __dirname + "/dist",
    filename: "[name].bundle.js",
  },
};

大家可以動(dòng)手實(shí)踐一下御板,很好理解锥忿。打包出來的單個(gè)或者多個(gè)文件直接可以在html中使用。

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

3. loaders

loader是webpack的加載器怠肋,可以幫我們處理各種非js文件。如css樣式淹朋,vue笙各、jsx、weex等后綴的代碼础芍,JPG杈抢、PNG圖片等。所以我們一般會(huì)在package.json中看到各種***-loader仑性。這些就是各類資源的loader加載器惶楼。
在module的loaders數(shù)組中可以有多個(gè)對(duì)象,每個(gè)對(duì)象就是一個(gè)加載器诊杆。下面是babel-loader的最簡單配置方式

  module: {
    loaders: [
      {
        test: /\.js$/,
        loader: 'babel',
      },
    ]
  }

對(duì)象中的test是正則表達(dá)式歼捐,用于搜索后綴為.js的文件。loader是所用加載器名稱晨汹。

4. 使用babel來轉(zhuǎn)譯ES6代碼

下面我們來一步步使用babel-loader將ES6語法用于項(xiàng)目中豹储。
webpack打包的文件默認(rèn)是不支持ES6的,我們需要用babel轉(zhuǎn)譯淘这。

4.1 安裝babel

這個(gè)配置其實(shí)我是抄的vue-cli剥扣,個(gè)人對(duì)babel用法還不是很熟。
在package.json中添加依賴铝穷。

  "devDependencies": {
    ...
    "babel-core": "^6.22.1",
    "babel-loader": "^6.2.10",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-preset-es2015": "^6.0.0",
    "babel-preset-stage-2": "^6.0.0",
    "babel-register": "^6.0.0",
    "webpack": "^1.14.0"
    ...
  }

npm安裝

$ npm install

4.2 在webpack.config.js中添加babel-loader的配置

  module: {
    loaders: [
      {
        test: /\.js$/,
        loader: 'babel',
      },
    ]
  }

4.3 添加.babelrc

在項(xiàng)目根目錄下添加.babelrc文件钠怯,文件內(nèi)容為

{
  "presets": ["es2015", "stage-2"],
  "plugins": ["transform-runtime"],
  "comments": false
}

4.4 使用ES6

import good from './good.js'

三、分析vue-cli

說了這么多曙聂,我的最終目的還是為了學(xué)習(xí)Vue.js晦炊。所以在對(duì)webpack有了一定的理解之后,就發(fā)現(xiàn)其實(shí)vue-cli并不是那么深不可測筹陵。

1. 結(jié)構(gòu)分析

  • build —— 項(xiàng)目構(gòu)建文件夾
  • build.js —— 打包構(gòu)建腳本(npm run build)
  • check-versions.js —— npm和node版本的查詢
  • dev-client.js ——
  • dev-server.js —— 開發(fā)調(diào)試腳本(npm run dev)
  • utils.js —— 工具類
  • webpack.base.config.js —— Webpack配置文件
  • webpack.dev.config.js —— 開發(fā)版本W(wǎng)ebpack配置文件刽锤,與webpack.base.config.js合并成完整的配置文件。
  • webpack.prod.config.js —— 生產(chǎn)版本W(wǎng)ebpack配置文件朦佩,與webpack.base.config.js合并成完整的配置文件并思。
  • config —— 配置文件夾,保存有各種配置參數(shù)(文件路徑语稠、服務(wù)器端口宋彼、功能開關(guān))
  • src —— 代碼文件夾
  • static
  • .gitkeep —— 作用是將文件所在文件夾保留在git版本控制中弄砍。文件類型和.gitignore差不多。
  • .babelrc —— babel配置文件
  • .editorconfig —— 編輯配置输涕,確保使用各種編輯器時(shí)能有相同的編輯格式音婶。
  • .gitignore —— git忽略文件
  • index.html —— 頁面,最終顯示在這個(gè)html中
  • package.json —— npm配置文件莱坎,包含了項(xiàng)目的信息衣式、腳本、依賴庫等重要信息檐什。

2. 創(chuàng)建簡易cli

理解完vue-cli的某些功能后碴卧,不難發(fā)現(xiàn)我們自己也可以搭建簡易的vue-cli了。
官方的腳手架中除了有webpack打包乃正,還包含了node腳本住册、開發(fā)和生產(chǎn)模式的切換、ESLint配置等功能瓮具。我們暫時(shí)不需要荧飞,將項(xiàng)目簡化來更好的理解webpack。

2.1 package.json

讓我們來自己建立一個(gè)cli名党,首先創(chuàng)建一個(gè)空文件夾叹阔。

$ mkdir demo05
$ cd demo05

初始化npm

$ npm init

然后復(fù)制vue-cli中的依賴庫到package.json中(直接復(fù)制啦,具體依賴庫的作用就不提啦~之后會(huì)寫博客補(bǔ)上的)兑巾。

  "dependencies": {
    "vue": "^2.1.0"
  },
  "devDependencies": {
    "autoprefixer": "^6.4.0",
    "babel-core": "^6.0.0",
    "babel-loader": "^6.0.0",
    "babel-plugin-transform-runtime": "^6.0.0",
    "babel-preset-es2015": "^6.0.0",
    "babel-preset-stage-2": "^6.0.0",
    "babel-register": "^6.0.0",
    "chalk": "^1.1.3",
    "connect-history-api-fallback": "^1.1.0",
    "css-loader": "^0.25.0",
    "eventsource-polyfill": "^0.9.6",
    "express": "^4.13.3",
    "extract-text-webpack-plugin": "^1.0.1",
    "file-loader": "^0.9.0",
    "friendly-errors-webpack-plugin": "^1.1.2",
    "function-bind": "^1.0.2",
    "html-webpack-plugin": "^2.8.1",
    "http-proxy-middleware": "^0.17.2",
    "json-loader": "^0.5.4",
    "semver": "^5.3.0",
    "opn": "^4.0.2",
    "ora": "^0.3.0",
    "shelljs": "^0.7.4",
    "url-loader": "^0.5.7",
    "vue-loader": "^10.0.0",
    "vue-style-loader": "^1.0.0",
    "vue-template-compiler": "^2.1.0",
    "webpack": "^1.13.2",
    "webpack-dev-middleware": "^1.8.3",
    "webpack-hot-middleware": "^2.12.2",
    "webpack-merge": "^0.14.1"
  },

2.2 webpack.config.js

這里的webpack配置文件中的部分內(nèi)容是從官方的 webpack.base.config.js 中復(fù)制出來的条获。正如我項(xiàng)目結(jié)構(gòu)中所說的,vue-cli中的 webpack.base.config.js 是基礎(chǔ)的配置文件蒋歌。vue-cli中的 webpack.dev.config.jswebpack.prod.config.js 分別代表了開發(fā)和生產(chǎn)版本的webpack配置文件帅掘,他們與 webpack.base.config.js 合并成最后的webpack配置文件。這里我們只要找到 webpack.base.config.js 即可堂油。
下面是完整配置代碼修档。

var path = require("path")
var projectRoot = path.resolve(__dirname, '../')

module.exports = {
  // 入口文件
  entry: "./src/main.js",
  // 輸出文件
  output: {
    filename: "./dist/bundle.js"
  },
  // 別名
  resolve: {
    extensions: ['', '.js', '.vue', '.json'],
    fallback: [path.join(__dirname, '../node_modules')],
    alias: {
      'vue$': 'vue/dist/vue.common.js',
      'src': path.resolve(__dirname, '../src'),
      'assets': path.resolve(__dirname, '../src/assets'),
      'components': path.resolve(__dirname, '../src/components')
    }
  },
  module: {
    // 加載器
    loaders: [
      {
        test: /\.vue$/,
        loader: 'vue'
      },
      {
        test: /\.js$/,
        loader: 'babel',
        exclude: /node_modules/
      },
      {
        test: /\.json$/,
        loader: 'json'
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url',
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url',
      }
    ]
  },
}

2.3 添加必要文件

由于使用git、babel府框,所以我將vue-cli中的 .gitignore.babelrc 直接復(fù)制過來吱窝。
還有,由于懶得寫邏輯代碼迫靖,這里我將 src 文件夾中所有內(nèi)容也直接復(fù)制過來院峡。
復(fù)制按成后進(jìn)行webpack打包。

$ webpack

打包完成就會(huì)出現(xiàn)一個(gè)在 dist 目錄下有一個(gè) bundle.js 文件系宜。有了打包文件照激,我們還需要?jiǎng)?chuàng)建一個(gè) index.html 來顯示效果,這個(gè)之后再說盹牧。
所以俩垃,最后的項(xiàng)目結(jié)構(gòu)如下圖

image.png

2.4 index.html

現(xiàn)在励幼,到了呈現(xiàn)效果的時(shí)候了。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Demo3</title>
  </head>
  <body>
    <div id="app">
    </div>
    <script src="./dist/bundle.js"></script>
  </body>
</html>

很簡單口柳,創(chuàng)建一個(gè)id為app的div元素用于顯示Vue組件內(nèi)容苹粟,然后將打包好的bundle.js引用進(jìn)去。
現(xiàn)在跃闹,到項(xiàng)目目錄中找到 index.html 頁面嵌削,瀏覽器打開就可以看到效果啦~

image.png

四、相關(guān)資料推薦

這里推薦一下我學(xué)習(xí)webpack中發(fā)現(xiàn)的一些好的網(wǎng)站辣卒,分享一下掷贾。
https://github.com/webpack-china/awesome-webpack-cn
http://blog.guowenfh.com/2016/03/24/vue-webpack-01-base/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荣茫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌场靴,老刑警劉巖啡莉,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旨剥,居然都是意外死亡咧欣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門轨帜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魄咕,“玉大人,你說我怎么就攤上這事蚌父∠迹” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵苟弛,是天一觀的道長喝滞。 經(jīng)常有香客問我,道長膏秫,這世上最難降的妖魔是什么右遭? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮缤削,結(jié)果婚禮上窘哈,老公的妹妹穿的比我還像新娘。我一直安慰自己亭敢,他們只是感情好滚婉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吨拗,像睡著了一般满哪。 火紅的嫁衣襯著肌膚如雪婿斥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天哨鸭,我揣著相機(jī)與錄音民宿,去河邊找鬼。 笑死像鸡,一個(gè)胖子當(dāng)著我的面吹牛活鹰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播只估,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼志群,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了蛔钙?” 一聲冷哼從身側(cè)響起锌云,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吁脱,沒想到半個(gè)月后桑涎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼贡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年攻冷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遍希。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡等曼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凿蒜,到底是詐尸還是另有隱情禁谦,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布篙程,位于F島的核電站枷畏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虱饿。R本人自食惡果不足惜拥诡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氮发。 院中可真熱鬧渴肉,春花似錦、人聲如沸爽冕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颈畸。三九已至乌奇,卻和暖如春没讲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背礁苗。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工爬凑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人试伙。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓嘁信,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疏叨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子潘靖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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