VueJS:手把手教你搭建webpack+babel+vue+mintui項目 [附帶項目源碼]

背景概述

鑒于筆者多次搭建,又常常比較難記住,到處翻查資料抵代,特別浪費時間,所以對自己所學(xué)習(xí)的知識做一個小小的總結(jié)忘嫉,方便日后的開發(fā)的時候使用荤牍。本文建立在你已經(jīng)熟悉vue的前提下,但是對基本步驟并不是很容易就能夠想起來的情況下庆冕。
代碼所在地址康吵。網(wǎng)址是正常的,可以放心訪問访递,只是一個代碼倉庫而已晦嵌。
https://gitee.com/blueboz/vue-demo/tree/master

基本搭建步驟

1.創(chuàng)建空項目

在這里插入圖片描述

2.項目上使用npm 初始化

這一步驟只是所有npm項目的常規(guī)初始化

npm init -y

3.安裝webpack

安裝webpack , 命令行工具,可以讓我們在命令行使用webpack進行打包惭载,以及webpack-dev-server,方便我們在開發(fā)的時候旱函,直接進行熱部署

npm i webpack webpack-cli webpack-dev-server -D

在項目根目錄下

var path = require('path');
var webpack = require('webpack');
module.exports = {
    mode: 'development',
    entry: './src/index.js',
    output: {
        path: path.resolve(__dirname, './dist'),
        filename: 'bundle.js'
    },
    devServer: {
        contentBase:'./dist',
        hot:true,
        port:3000
    },
    plugins: []
}

package.json文件中添加如下內(nèi)容,這樣子描滔,便可以使用npm run dev 進行運行陡舅,以及npm run build 進行打包

"scripts": {
    "dev": "webpack-dev-server --open --hot",
    "build": "webpack --progress --hide-modules"
  }

這時候,如果啟動npm run dev會為我們打開一個界面伴挚,提示如下錯誤靶衍。那么現(xiàn)在,我們需要提供一些js腳本茎芋,來豐富我們的功能颅眶,以及一些插件為我們提供支持。


在這里插入圖片描述

小Tips
在package.json文件上點擊右鍵田弥,show npm Scripts涛酗,會出現(xiàn)一個npm 面板

在這里插入圖片描述

4.安裝必要的插件(css,js,png,html)

  1. (*.html) html-webpack-plugin
  2. (*.css) style-loader css-loader
  3. (*.less) less less-loader
  4. (.sass/.scss) node-sass sass-loader(不作介紹)
  5. (*.js) babel-loader@7 babel-core babel-preset-env(babel-preset-es2015, es2016, es2017)
  6. (*.js) babel-polyfill |babel-runtime,babel-transform-runtime

第1 步驟,先建立index.html 與index.js 文件

在這里插入圖片描述

筆者的index.js文件中偷厦,使用了es6的箭頭函數(shù)商叹,以及Generator函數(shù),目地是為了后面引出Babel 的使用作鋪墊只泼。


在這里插入圖片描述

第1步剖笙,處理html模板文件

npm i html-webpack-plugin -D

然后在,webpack.config.js文件的plugins中添加,表示请唱,以src目錄下的index.html作為模板弥咪,并且在這個html文件的最后,追加bundle.js腳本的引用十绑。

new HtmlWebpackPlugin({
        template: './src/index.html',
        filename: 'index.html'
 })

這個使用使用npm run dev
是可以預(yù)覽到頁面應(yīng)該有的效果(使用Chrome 或者火狐聚至,不要用IE)

第二步驟支持css樣式的使用

npm i style-loader css-loader -D

然后在webpack.config.js文件中添加,

plugins:[],
module: {
        rules: [
            {
                test:/\.css$/,
                use:['style-loader','css-loader']
            }
        ]
    }

然后就支持了css了,

第三步驟本橙,支持less

npm i less less-loader -D

rules中添加

{
     test:/\.less$/,
     use:['style-loader','css-loader','less-loader']
}

第四步驟扳躬、支持jpg,png ,ttf等

npm i file-loader -D

同樣的,在rules里面添加如下

{
    test:/\.(png|svg|jpg|gif)$/,
    use:['file-loader']
},{
    test:/\.(woff|woff2|eot|ttf|otf)$/,
    use:['file-loader']
}

到了這一步甚亭,我們已經(jīng)支持了css,less,html,字體資源贷币,圖片等等,
看似順利狂鞋,氣死不然片择,如果現(xiàn)在,你使用一些低端的瀏覽器打開我們的頁面骚揍,你會驚奇的發(fā)現(xiàn)頁面沒有正常打開字管,這是因為啰挪,我們的index.js腳本里面應(yīng)用了很多的es6的語法,如let 嘲叔,class 亡呵,以及Generator 函數(shù)。
那么我們應(yīng)該怎么支持這些新語法呢硫戈?答案是我們下面要引入的babel锰什。

第五步驟,引入Babel

目前的Babel已經(jīng)支持到了7 ,與Babel6 的不同大概是插件包的名稱叫法的改變而已丁逝,
舉個例子來說汁胆,babel 有幾大核心的組件
babel-core,babel-preset-env,babel-loader,在babel 6中,安裝這幾個插件的命令

npm i babel-core babel-preset-env babel-loader@7

但是在babel7 中是使用

npm i @babel/core @babel/preset-env babel-loader@8

只是名稱的改變而已霜幼,實質(zhì)上沒有太大的區(qū)別嫩码。
作為樣例,我們這里使用babel6來舉例子罪既。配置上的不同我也會指出來铸题。

步驟a.安裝基礎(chǔ)包
npm i babel-cli -g
npm i babel-core  babel-preset-env babel-loader@7 -D

babel-core提供一些核心的API接口給我們,可以通過如下代碼導(dǎo)入工具包

var babel = require("@babel/core");
import { transform } from "@babel/core";
import * as babel from "@babel/core";

然后調(diào)用babel 的一些方法進行轉(zhuǎn)化琢感,詳細(xì)信息可以參考官方對該插件的描述內(nèi)容丢间。https://babeljs.io/docs/en/next/babel-core.html

babel-cli 是干嘛的,提提供一個babel終端工具驹针,可以讓我們自己編譯js文件
一般建議全局安裝,使用辦法是

babel index.js --out-dir lib -options

對于babel-preset-env 這個工具包烘挫,我們還得從其他插件談起,由于babel對代碼的轉(zhuǎn)化都是基于插件的牌捷,也就是plugins墙牌,這意味著,對于箭頭函數(shù),就會有一個插件用于轉(zhuǎn)化箭頭函數(shù)的暗甥。確實如此,如下地址就是對該插件的描述
https://babeljs.io/docs/en/next/babel-plugin-transform-arrow-functions.html
問題來了捉捅,那么如果要轉(zhuǎn)化class關(guān)鍵字撤防,generator函數(shù)呢?
確實也是有的棒口,如下兩個地址分別是class轉(zhuǎn)化函數(shù)與generator轉(zhuǎn)化函數(shù)的描述寄月。
https://babeljs.io/docs/en/next/babel-plugin-transform-classes.html
https://babeljs.io/docs/en/next/babel-plugin-transform-regenerator.html
對與每一個插件,我們需要在
.babelrc文件里面无牵,添加類似的漾肮,這樣會導(dǎo)致我們的plugins變得龐大

在這里插入圖片描述

上圖的插件配置引自babel7 ,看不懂的話把@去掉,"/"替換成"-" 就是完整的插件名稱了茎毁。

而preset-env這個插件克懊,即是為了整合而出現(xiàn)的忱辅,使用這個preset-env,我們就沒有必要一個一個引用了谭溉。只需要引入preset-env這一個預(yù)置的插件即可

最后一個是babel-loader 墙懂,這個應(yīng)該算是一個中間的媒介,作為webpack打包的規(guī)范工具扮念,我們知道损搬,作為webpack 來說,babel是一個未知的東西柜与,對于webpack在打包js文件的時候巧勤,他并不知道箭頭函數(shù)應(yīng)該怎么處理,巧的是,babel知道弄匕,但是踢关,webpack應(yīng)該怎么讓babel幫他轉(zhuǎn)化呢,答案是,實現(xiàn)webpack的rules中的插件粘茄,在處理js的時候签舞,調(diào)用babel插件,這就是babel-loader的作用了柒瓣。

注意要在webpack.config.js文件中添加如下代碼

{
    test:/\.js$/,
    use:['babel-loader'],
    exclude:/node_modules/
}

來說說.babelrc ,這個文件一共分為兩種配置
presets和plugins儒搭,這個我們之前也有簡單的提過,preset 一般是一些一體包芙贫,一般包含許多的插件搂鲫,而plugins 是單獨一個插件的配置。

{
  "presets": [
    ["env",{
      "targets": {
        "browsers": ["> 1%", "last 2 versions"]
      }
    }]
  ]
}

一切看似差不多了磺平,那么我們可以使用babel 編譯一下魂仍,看看我們編譯完之后,腳本是什么樣子
babel src\index.js --out-dir lib
你會驚奇的發(fā)現(xiàn)拣挪,我們寫的箭頭函數(shù)擦酌,變成了這樣子了。這正好是低級瀏覽器所支持的菠劝。


在這里插入圖片描述

class關(guān)鍵字赊舶,被轉(zhuǎn)化成了調(diào)用_createClass公共方法了。


在這里插入圖片描述

這個時候赶诊,我們新建一個index.html 引用我們生成的腳本笼平,這個時候,一開始正常的界面反而不正常了舔痪。
在這里插入圖片描述

還報錯了寓调,這是因為我們使用generator函數(shù)里面調(diào)用了regeneratorRuntime這個一個實體類,這個實體類需要引用一個基礎(chǔ)包锄码。這也就引入我們下一步的動作
步驟b.安裝babel-polyfill 或babel-runtime,babel-transform-runtime

這里有2個選擇夺英,依賴babel-poly ,這個提供了一些高級語法轉(zhuǎn)化過程中晌涕,使用到的一些依賴包,
我們先試試這個秋麸。

 npm i babel-polyfill -S

然后又有2中方法引入
第一種渐排,在index.js文件中通過如下代碼進行依賴

import 'babel-polyfill'

第二種,在webpack.config.js中添加如下的entry也可以實現(xiàn)灸蟆。

entry: ['babel-polyfill','./src/index.js'],

現(xiàn)在驯耻,讓我們啟動一下我們的網(wǎng)站,在IE里面炒考,可以發(fā)現(xiàn)頁面也可以打開了可缚,到這一步,你是不是認(rèn)為就可以了斋枢,其實帘靡,不然,因為上一步瓤帚,我們需要在腳本里面引入babel-poly,實際對我們的代碼已經(jīng)產(chǎn)生了侵犯,污染變量

第二種選擇是使用插件方式描姚,這個插件,會對一些公共方法進行抽取戈次,同時提供類似polyfilll的功能轩勘。

npm install --save-dev babel-plugin-transform-runtime
npm install --save babel-runtime

并且將如下代碼加入.babelrc,記住去掉我們上一步加的polyfill的哪些代碼

{
    "plugins": ["transform-runtime"]
}

使用babel命令再次編譯,可以看到編譯之后怯邪,代碼里面為我們依賴了_regenerator 绊寻,這個正是上一步驟中,我們使用polyfill引入的悬秉,通過require方式引入澄步,減少了對變量的污染。此外和泌,像createClass方法村缸,都被抽取babel-runtime里面,這里也很好的解釋了babel-runtime包的作用允跑!王凑,此外,transform-runtime作為一個插件被使用聋丝,他有什么功能?他具體也是一個代碼轉(zhuǎn)化插件包工碾,與babel-runtime 不同的是弱睦,他是提供轉(zhuǎn)化代碼工具,不在運行時使用渊额,而babel-runtime提供的 是一些需要在程序運行時需要使用的公共包况木。

在這里插入圖片描述

這里存在著一個坑垒拢。https://mp.csdn.net/mdeditor/98637033#
參考我的另一篇文章。

到了目前的這一步火惊,我們算是解決了一堆的前設(shè)條件,接下來是支持vue
前面的求类,npm un babel-polyfill卸載掉polyfill,這個可以看你的喜好屹耐,如果你喜歡polyfill可以把babel-runtime /transformer給卸載掉尸疆,并去掉配置,留一個就好了惶岭,當(dāng)然你想2個留著也可以寿弱,自己參考官方文檔,看看他們的整合配置按灶,可以說polyfill功能比runtime小症革,因為runtime還提供一些基礎(chǔ)方法的抽離。這點也是我建議用runtime 的原因所在鸯旁。

5. 安裝vue

npm i vue -S
npm i vue-style-loader -D

vue插件提供了我們寫代碼的時候的依賴

import Vue from 'vue'

new Vue({
    el:"#app"
})

同時噪矛,打開我們之前的webpack.config.js文件,修改里面的style-loader為vue-style-loader铺罢,這個插件(vue-style-loader)會幫我們處理一些vue控件里面的樣式設(shè)置艇挨。

6.這個時候,我們又出現(xiàn)了2條分支

安裝了vue 之后畏铆,呢雷袋,此時,如果你采用傳統(tǒng)的開發(fā)方式(不建議)在我們的Vue實例里面填寫一些方法辞居,然后界面上渲染之類的楷怒,你會發(fā)現(xiàn)并不行。


在這里插入圖片描述

這是因為瓦灶,我們通過Import導(dǎo)入的vue是一個不完整的版本鸠删。


在這里插入圖片描述

那這個時候要怎么辦?簡單贼陶,引入完整的不就得了刃泡。
在這里插入圖片描述

當(dāng)然,你如果不想這么做,像在webpack.config.js里面

 resolve: {
        alias: {
            'vue$': 'vue/dist/vue.esm.js'
        }
    },

也是可以的碉怔。
剛剛上面我們說到2個分支烘贴。那么另外一條分支是啥。另外一條分支是使用*.vue結(jié)尾的文件撮胧。
使用vue結(jié)尾的文件桨踪,我們第一時間就會想到轉(zhuǎn)化器,也就是webpack轉(zhuǎn)化器芹啥,那么就得再安裝插件了锻离。

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

裝完之后铺峭,進入webpack.config.js配置文件

{
     test: /\.vue$/,
     loader: 'vue-loader'
 },

在webpack.config.js中
引入插件

const VueLoaderPlugin = require('vue-loader/lib/plugin')

然后在plugins里面添加如下代碼


在這里插入圖片描述

這個時候,我們的首頁的內(nèi)容如下汽纠,這里需要注意卫键,導(dǎo)入vue的時候,是使用vue而不是vue.min.js虱朵,因為這樣會導(dǎo)致出問題的


在這里插入圖片描述

打開界面莉炉,成功訪問,那么這時候卧秘,vue也算是搭建ok了呢袱。此外如果你希望使用vue-router 的話〕岬校可以通過如下代碼引入

npm install vue-router --save-dev

然后就可以使用路由了羞福。

支持MintUI

1.通過如下命令進行安裝

npm i mint-ui -S

2.全局導(dǎo)入法

全局導(dǎo)入然后就可以在頁面中隨便使用了。但是我們采用另外一種方式蚯涮,按需導(dǎo)入

import MintUI from 'mint-ui'
import 'mint-ui/lib/style.css'
Vue.use(MintUI)

然后你就可以在我們的頁面中隨意的引用治专。


在這里插入圖片描述

3.按需導(dǎo)入法

按需導(dǎo)入可以減少打包的bundle.js文件的體積,這個在線上環(huán)境來說是很有幫助的遭顶。
做法稍微麻煩了一點點张峰。還需要安裝babel的一個插件,這個插件將會為我們按需導(dǎo)入提供幫助棒旗。

a.安裝插件

npm install babel-plugin-component -D

b.修改.babelrc
在.babelrc文件中添加如下片段,可以理解為添加了component插件喘批,并且針對了這個插件進行了配置。

  "plugins": [["component", [
    {
      "libraryName": "mint-ui",
      "style": true
    }
  ]]]

針對本例子铣揉,由于我們在前面使用了transform-runtime饶深,所以在這里我們會多一個插件


在這里插入圖片描述

后記

作為平常我們的項目開發(fā)中,需求快速開發(fā)會讓我們失去了對本質(zhì)的了解逛拱,我們要學(xué)會跳脫開日常開發(fā)的瑣碎敌厘,理解到技術(shù)的根本,才能在技術(shù)的道路上越走越遠(yuǎn)朽合。

至此俱两,我們的項目搭建全部內(nèi)容也就完畢。創(chuàng)作不易曹步,喜歡的讀者可以支持一下筆者宪彩。


在這里插入圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市讲婚,隨后出現(xiàn)的幾起案子毯焕,更是在濱河造成了極大的恐慌,老刑警劉巖磺樱,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纳猫,死亡現(xiàn)場離奇詭異,居然都是意外死亡竹捉,警方通過查閱死者的電腦和手機芜辕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來块差,“玉大人侵续,你說我怎么就攤上這事『┤颍” “怎么了状蜗?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹉动。 經(jīng)常有香客問我轧坎,道長,這世上最難降的妖魔是什么泽示? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任缸血,我火速辦了婚禮,結(jié)果婚禮上械筛,老公的妹妹穿的比我還像新娘捎泻。我一直安慰自己,他們只是感情好埋哟,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布笆豁。 她就那樣靜靜地躺著,像睡著了一般赤赊。 火紅的嫁衣襯著肌膚如雪闯狱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天砍鸠,我揣著相機與錄音扩氢,去河邊找鬼。 笑死爷辱,一個胖子當(dāng)著我的面吹牛录豺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饭弓,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼双饥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了弟断?” 一聲冷哼從身側(cè)響起咏花,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昏翰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苍匆,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年棚菊,在試婚紗的時候發(fā)現(xiàn)自己被綠了浸踩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡统求,死狀恐怖检碗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情码邻,我是刑警寧澤折剃,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站像屋,受9級特大地震影響怕犁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜开睡,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一因苹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篇恒,春花似錦扶檐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹋砚。三九已至坠敷,卻和暖如春珊擂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背解虱。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工攘须, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人殴泰。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓于宙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悍汛。 傳聞我的和親對象是個殘疾皇子捞魁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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