Vue全家桶-前端工程化

一、模塊化相關規范

1.模塊化概述

傳統開發模式的主要問題:

命名沖突,文件依賴

通過模塊化解決上述問題:

模塊化就是把單獨的一個功能封裝到一個模塊(文件)中,模塊之間相互隔離,但是可以通過特定的接口公開內部成員,也可以依賴別的模塊。

模塊化開發的好處:方便代碼重用,從而提升開發效率,并且方便后期的維護。

2.瀏覽器端模塊化規范

①AMD

Require.js (http://www.requirejs.cn/)

②CMD

Sea.js (http://seajs.github.io/seajs/docs/)

3.服務器端模塊化規范

①CommonJS

模塊化分為單文件模塊與包

模塊成員導出:module.exports和exports

模塊成員導入:require('模塊標識符')

4.大一統的模塊化規范-ES6模塊化

在ES6模塊化規范誕生之前,JavaScript社區已經嘗試并提出了AMD, CMD,CommonJS等模塊化規范。

但是,這些社區提出的模塊化標準,還是存在一定的差異性與局限性,并不是瀏覽器與服務器通用的模塊化標準,例如

AMD和CMD適用于瀏覽器端的JavaScript模塊化。

CommonJS適用于服務器端的JavaScript模塊化

因此,ES6語法規范中,在語言層面上定義了ES6模塊化規范,是瀏覽器端與服務器端通用的模塊化開發規范。

ES6模塊化規范中的定義:

每個js文件都是一個獨立的模塊

導入模塊成員使用import關鍵字

暴露模塊成員使用exolport關鍵字

①Node.js中通過babel體驗ES6模塊化

⑴npm install --save-dev @babel/core @babel/click @babel/preset-env @babel/node

⑵npm install --save @babel/polyfill

(3)項目根目錄創建文件 babel.config.js

(4)babel.config.js文件內容如下面代碼

const presets = [

? ? ["@babel/env", {

? ? ? ? targets : {

? ? ? ? edge: "17",

? ? ? ? firefox : "60",

? ? ? ? chrome : "67",

? ? ? ? safari : "11.1"

? ? ? ? }

? ? }]

];

module.exports = { presets };

⑸通過npx babel-node index.js執行代碼

5.ES6模塊化的基本語法

①默認導出與默認導入

默認導出語法: export default 默認導出的成員

默認導入語法: import 接收名稱 from '模塊標識符'

//導入模塊成員

import m1 from './m1.js'

console.log(m1);

//打印輸出的結果為:

// {a:10,c:20,show:[Function:show]}

//當前文件為m1.js

//定義私有成員a和c

let a = 10

let c = 20

//外界訪問不到變量d,因為它沒有暴露出去

let d = 30

function show () {

? ? ? //將本模塊中的私有成員暴露出去,供其他模塊使用

export default {

? ? a,

? ? c,

? ? show

}

注意:每個模塊中,只允許使用唯一的一次 export default,否則會報錯。

②按需導出與按需導入

按需導出語法: export let s1 = 10

按需導入語法: import { s1 } from '模塊標識符'

//導入模塊成員

import { s1,s2 as ss2,say} from './m1.js'

console.log(s1)//aaa

console.log(ss2)//ccc

console.log(say)//[Function : say]

//當前文件模塊為m1.js

//向外按需導出變量s1,s2,say

export let s1 = 'aaa'

export let s2 = 'ccc'

export function say = function () {}

注意:每個模塊中,可以使用多次按需導出

③直接導入并執行模塊代碼

有時候,我們只想單純執行某個模塊中的代碼,并不需要得到模塊中向外暴露的成員,此時,可以直接導入并執行模塊代碼。

//直接導入并執行模塊代碼

import './m2.js'

//當前文件模塊m2.js

//在當前模塊中執行一個for循環操作

for(let i = 0; i < 3; i++) {

? ? consol.log(i)

}

二、webpack

1.當前web開發面臨的問題

文件依賴關系錯綜復雜

靜態資源請求效率低

模塊化支持不友好

瀏覽器對高級JavaScript特性兼容程度較低

etc...

2.webpack概述

webpack是一個流行的前端項目構建工具(打包工具),可以解決當前web開發中所面臨的困境。

webpack提供了友好的模塊化支持,以及代碼壓縮混淆,處理js兼容問題,性能優化等強大的功能,從而讓程序員把工作的重心放到具體的功能實現上,提高了開發效率和項目的可維護性。

目前大多數企業中的前端項目,都是基于webpack進行打包構建的。

webpack的基本使用:

①創建列表隔行變色項目

⑴新建項目空白目錄,并運行 npm init -y命令,初始化包管理配置文件package.json

⑵新建src源代碼目錄

⑶新建src -> index.html首頁

⑷初始化首頁基本的結構

⑸運行 npm install jQuery -S命令,安裝jQuery

(6)通過模塊化的形式,實現列表隔行變色效果

②在項目中安裝和配置webpack

⑴運行 npm install webpack-cli -D命令,安裝webpack相關的包

⑵在項目根目錄中,窗簾名為webpack.config.js的webpack配置文件

⑶在webpack的配置文件中,初始化如下基本配置:

module.exports = {

? ? mode : 'development' //mode用來指定構建模式

}

⑷在package的配置文件中scripts節點下,新增dev腳本如下:

"scripts": {

? ? "dev" : "webpack" //script節點下的腳本,可以通過npm run 執行

}

⑸在終端中運行npm run dev命令,啟動webpack進行項目打包。

③配置打包的入口與出口

webpack的4.x版本中默認約定:

打包的入口文件為src -> index.js

打包的輸出文件為dist ->main.js

如果要修改打包的入口與出口,可以在webpack.config.js中新增如下配置信息:

const path = require('path')//導入node.js中專門操作路徑的模塊

module.exports = {

? entry : path.join(__dirname, './src/index.js') //打包入口文件的路徑

output: {

? path: path.join(__dirname, './dist'),//輸出文件存放路徑

? filename: 'bundle.js' //輸出文件的名稱

? }

}

④配置webpack的基本使用

⑴運行npm install webpack-dev-server -D命令,安裝支持項目自動打包的工具

⑵修改package.json -> scripts中的dev命令如下:

"scripts" : {

? ? "dev": "webpack-dev-server" //script節點下的腳本,可以通過npm run運行

⑶將src -> index.html中,script腳本的引用路徑,修改為"/buldel.js"

⑷運行npm run dev 命令重新進行打包

⑸在瀏覽器中訪問http://localhost:8080地址,查看自動打包效果

注意:webpack-dev-server會啟動一個實時打包的http服務器

webpack-dev-server 打包生成的輸出文件,默認放到了項目根目錄中,而且是虛擬的,看不見的。

⑤配置html-webpack-plugin生成預覽頁面

⑴運行npm install html-webpack-plugin -D命令,安裝生成預覽頁面的插件

⑵修改webpack.config.js文件頭部區域,添加如下配置信息

//導入生成預覽頁面的插件,得到一個構造函數

const HtmlWebpackPlugin = require('html-webpack-plugin')

const htmlPlugin = new HtmlWebpackPlugin({//創建插件的實例對象

? ? template:'./src/index.html',//指定要用到的模板文件

? ? filename : 'index.html'? //指定生成的文件的名稱,該文件存在于內存中,在目錄中不顯示

})

⑶修改webpack.config.js文件中向外暴露的配置對象,新增如下配置節點:

module.exports = {

? ? plugins: [ htmlPlugin] //plugins數組是webpack打包期間會用到的一些插件列表

}

⑥配置自動打包相關的參數

//package.json中的配置

//--open 打包完成后自動打開瀏覽器頁面

//--host配置IP地址

//--port配置端口

"scripts": {

? ? "dev": "webpack-dev-server --open --host 127.0.0.1 --port 8888"

}

3.webpack中的加載器

①通過loader打包非js模塊

在實際開發過程中,webpack默認只能打包處理以.js后綴名結尾的模塊,其他非.js后綴名結尾的模塊,webpack默認處理不了,需要調用loader加載器才可以正常打包,否則會報錯。

loader加載器可以協助webpack打包處理特定的文件模塊,比如:

less-loader可以打包處理.less相關的文件

sass-loader可以打包處理.scss相關的文件

url-loader可以打包處理css中的url路徑相關的文件。

②loader的調用過程

將要被webpack打包處理的文件模塊-是否為js模塊,

4.webpack中加載器的基本使用

CSS

LESS

SCSS

PostCSS

JavaScript

Image/Font

Vue

①打包處理css文件

⑴運行npm i style-loader css-loader -D命令,安裝處理css 文件的loader

⑵在webpack.config.js的module -> rules數組中,添加loader規則如下:

//所有第三方文件模塊的匹配規則

module: {

? ? rules : [

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

? ? ]

}

其中,test表示匹配的文件類型,use表示對應要調用的loader

注意:

use數組中指定的loader順序是固定的

多個loader的調用順序是:從后往前調用。

②打包處理less文件

⑴運行npm i less-loader less -D命令

⑵在webpack.config.js的module -> rules數組中,添加loader規則如下:

//所有第三方文件模塊的匹配規則

module: {

? rules:[

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

? ]

}

③打包處理scss文件

⑴運行npm i sass-loader node-sass -D命令

⑵在webpack.config.js的module -> rules數組中,添加loader規則如下:

//所有第三方文件模塊的匹配規則

module: {

? rules:[

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

? ]

}

④配置postCss自動添加css的兼容前綴

⑴運行npm i postcss-loader autoprefixer -D命令

⑵在項目根目錄中創建postcss的配置文件postcss.config.js,并初始化如下配置:

const autoprefixer = require('autoprefixer') //導入自動添加前綴的插件

module.exports = {

? plugins: [autoprefixer]? //掛載插件

}

⑶在webpack.config.js的module -> rules 數組中,修改css 的loader規則如下:

module: {

? rules:[

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

? ]

}

⑤打包樣式表中的圖片和字體文件

⑴運行 npm i url-loader file-loader -D命令

⑵在webpack.config.js的 module -> rules數組中,添加loader規則如下:

module: {

? rules: [

? ? ? {

? ? ? ? test:/\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,

? ? ? ? use: 'url-loader?limit=16940'

? ? ? }

? ]

}

其中?之后的是loader的參數項。limit用來指定圖片的大小,單位是字節byte,只有小于limit大小的圖片,才會被轉化為base64圖片。

⑥打包處理js文件中的高級語法

⑴安裝babel轉換器相關的包:npm i babel-loader @babel/core @babel/runtime -D

(2)安裝babel語法插件相關的包:npm i @babel/preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties -D

⑶在項目根目錄中,創建babel配置文件babel.config.js并初始化基本配置如下:

module.export = {

? ? presets : ['@babel/preset-env'],

? ? plugins: ['@babel/plugin-transform-runtime ', '@babel/plugin-proposal-class-properties ']

}

(4) 在webpack.config.js的module -> rules數組中,添加loader規則如下:

//exclude 為排除項,表示babel-loader不需要處理node_modules 中的js文件

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

三、Vue單文件組件

1.傳統組件的問題和解決方案

問題:

全局定義嗯組件必須保證組件的名稱不重復。

字符串模板缺乏語法高亮,在HTML有多行的時候,需要用到丑陋的\。

不支持CSS意味著當HTML和JavaScript組件化時,CSS明顯被遺漏。

沒有構建步驟限制,只能使用HTML和ES5JavaScript,而不能使用預處理器(如babel)

解決方案:

針對傳統組件的問題,Vue提供了一個解決方案-使用Vue單文件組件。

2.Vue單文件組件的基本用法

單文件組件的組成結構

template 組件的模板區域

script 業務邏輯區域

style 樣式區域

<template>

? 這里用于定義Vue組件的模塊內容

</template>

<script>

? //這里用于定義Vue組件的業務邏輯

? export default {

? ? ? data :() {? return {}? },? //私有數據

? ? ? methods: {}? //處理函數

? ? ? //...其他業務邏輯

? }

</script>

<style scoped>

? 這里用于定義組件的樣式

</style>

3.webpack中配置的vue組件加載器

①運行npm i vue-loader vue-template-compiler -D命令

②在webpack.config.js配置文件中,添加vue-loader的配置項如下:

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

module.exports = {

? ? module: {

? ? ? rules:[

? ? ? ? ? //...其他規則

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

? ? ? ]

},

? plugins : [

? //...其他插件

? new VueLoaderPlugin() //請確保引入這個插件

? ]

}

4.在webpack項目中使用vue

①運行npm i vue -S安裝vue

②在 src -> index.js入口文件中,通過import Vue from 'vue'? 來導入vue構造函數

③創建vue的實例對象,并指定要控制的el 區域

④通過render函數渲染App根組件

//1.導入Vue構造函數

import Vue from 'vue'

//2.導入App根組件

import App from './comonents/App.vue'

const vm = new Vue({

? ? //3.指定vm實例要控制的頁面區域

? el: '#app',

? //4.通過render函數,把指定的組件渲染到 el 區域中

? ? render : h => h(App)

})

5.webpack打包發布

上線之前需要通過webpack將應用進行整體打包,通過package.json文件配置打包命令:

//在package.json文件中配置webpack打包命令

//該命令默認加載項目根目錄中的webpack.config.js配置文件

"scripts": {

? ? //用于打包的命令

? ? "build" : "webpack -p",

? ? //用于開發調試的命令

? ? "dev" : "webpack-dev-server --open --host 127.0.0.1 --port 3000",

}

四、Vue腳手架

1.Vue腳手架的基本用法

Vue腳手架用于快速生成Vue項目基礎架構,其官網地址:? http://click.vuwjs.org/zh/

使用步驟:

①安裝3.x版本Vue腳手架

npm install -g @vue/cli

基于3.x版本的腳手架創建vue項目

//⑴基于交互式命令行 的方式,創建 新版 vue項目

vue create my-project

//⑵基于 圖形化界面的方式,創建 新版vue項目

vue ui

//⑶基于2.x的舊模板,創建 舊版vue項目

npm install -g @vue/cli-init

vue init webpack my-project

2.Vue腳手架生成的項目結構分析

.git?

node_modules --------依賴包目錄

public-------靜態資源目錄

src------組件源碼目錄

.gitinore

babel.config.js ----babel配置文件

package.json

package-lock.json

README.md

3.Vue腳手架的自定義配置

①通過package.json配置項目

//必須是符合規范的json語法

"vue" : {

? ? "devServer" : {

? ? ? ? "port" : "8888",

? ? ? ? "open" : true

? ? ? }

}

注意:不推薦使用這種方式,因為package.json主要用來管理包的配置信息,為了方便維護,推薦將vue腳手架相關的配置,單獨定義到vue.config.js配置文件中。

②通過單獨的配置文件配置項目

⑴在項目的根目錄創建文件vue.config.js

⑵在該文件中進行相關配置,從而覆蓋男人嘛配置

//vue.config.js

module.exports = {

? devServer : {

? ? ? port : 8888

? }

}

五、Element-UI的基本使用

Element-UI:一套為開發者,設計師,和產品經理準備的基于vue 2.0的桌面端組件庫。

官網地址http://-cn.eleme.io/#/zh-CN

1.基于命令行方式手動安裝

①安裝依賴包npm i element-ui -S

②導入Element-UI相關資源

//導入組件庫

import ElementUI from 'element-ui';

//導入組件相關樣式

import 'element-ui/lib/theme-chalk/index.css';

//配置Vue插件

Vue.use(ElementUI);

2.基于圖形化界面自動安裝

①運行vue ui命令,打開圖形化界面

②通過Vue項目管理器,進入具體的項目配置面板

③點擊 插件 -> 添加插件,進入插件查詢面板

④搜索vue-cli-plugin-element并安裝

⑤配置插件,實現按需導入,從而減少打包后項目的體積。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。