1. 模塊化相關規範css
① 模塊化概述
html
傳統開發模式的主要問題:
前端
經過模塊化解決上述問題:
vue
② 瀏覽器端模塊化規範
node
③ 服務器端模塊化規範
jquery
CommonJS:webpack
④ 大一統的模塊化規範 – ES6模塊化
git
在 ES6 模塊化規範誕生以前, Javascript 社區已經嘗試並提出了 AMD、CMD、CommonJS 等模塊化規範。程序員
可是,這些社區提出的模塊化標準,仍是存在必定的差別性與侷限性、 並非瀏覽器與服務器通用的模塊化標準,例如:github
所以, ES6 語法規範中,在語言層面上定義了 ES6 模塊化規範,是瀏覽器端與服務器端通用的模塊化開發規範。
ES6模塊化規範中定義:
Node.js 中經過 babel 體驗 ES6 模塊化:
Node.js默認支持CommonJS中的模塊化規範,可是對ES6中的模塊化支持的並非很好,須要結合Babel這個第三方插件來體驗高級的ES6特性。
Babel是一個語法轉換工具,能夠把高級的有兼容性的JavaScript代碼轉換爲低級的沒有兼容性的JavaScript代碼。
如何在項目中配置Babel呢?
1)npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
2)npm install --save @babel/polyfill
3)項目跟目錄建立文件 babel.config.js
4)babel.config.js 文件內容如右側代碼
5)經過 npx babel-node index.js 執行代碼
const presets = [
["@babel/env", {
targets: {
edge: "17",
firefox: "60",
chrome: "67",
safari: "11.1"
}
}]
];
module.exports = { presets };
⑤ ES6 模塊化的基本語法
1)默認導出與默認導入
// 當前文件模塊爲 m1.js // 定義私有成員 a 和 c let a = 10 let c = 20 // 外界訪問不到變量 d ,由於它沒有被暴露出去 let d = 30 function show() {} // 將本模塊中的私有成員暴露出去,供其它模塊使用 export default { a, c, show }
// 導入模塊成員 import m1 from './m1.js' console.log(m1) // 打印輸出的結果爲: // { a: 10, c: 20, show: [Function: show] }
注意:每一個模塊中,只容許使用惟一的一次 export default,不然會報錯!
2)按需導出與按需導入
// 當前文件模塊爲 m1.js // 向外按需導出變量 s1 export let s1 = 'aaa' // 向外按需導出變量 s2 export let s2 = 'ccc' // 向外按需導出方法 say export function say = function() {}
// 導入模塊成員 import { s1, s2 as ss2, say } from './m1.js' console.log(s1) // 打印輸出 aaa console.log(ss2) // 打印輸出 ccc console.log(say) // 打印輸出 [Function: say]
注意:每一個模塊中,可使用屢次按需導出
注意:
import m1, { s1, s2 as ss2, say } from './m1.js'
3)直接導入並執行模塊代碼
有時候,咱們只想單純執行某個模塊中的代碼,並不須要獲得模塊中向外暴露的成員,此時,能夠直接導入並執行模塊代碼。
// 當前文件模塊爲 m2.js // 在當前模塊中執行一個 for 循環操做 for(let i = 0; i < 3; i++) { console.log(i) }
// 直接導入並執行模塊代碼 import './m2.js'
2. webpack
① 當前 Web 開發面臨的困境
② webpack 概述
③ webpack 的基本使用
1)建立列表隔行變色項目
// index.js文件 import $ from 'jquery'; $(function() { $('li:odd').css('backgroundColor', 'blue') $('li:even').css('backgroundColor', 'lightblue') })
<!-- index.html頁面 --> <script src="./index.js"></script> <!-- ul>li{這是第$個li}*9 --> <ul> <li>這是第1個li</li> <li>這是第2個li</li> <li>這是第3個li</li> <li>這是第4個li</li> <li>這是第5個li</li> <li>這是第6個li</li> <li>這是第7個li</li> <li>這是第8個li</li> <li>這是第9個li</li> </ul>
可是上面的代碼並不能實現隔行變色的效果,這是由於import $ from 'jquery'是ES6模塊化語法,瀏覽器中對這種語法支持的不是很好,因此瀏覽器不識別就報錯了。
如何解決呢?能夠基於webpack將這種兼容性的代碼轉換爲沒有兼容性的代碼。而且在html頁面中導入轉換以後的js文件
2)在項目中安裝和配置 webpack
module.exports = { mode: 'development' // mode 用來指定構建模式 }
"scripts": { "dev": "webpack" // script 節點下的腳本,能夠經過 npm run 執行 }
main.js是使用webpack打包後生成的文件,不存在兼容性問題,所以須要引入的是打包好後的main.js文件,而不是原來的index.js文件
<!-- <script src="./index.js"></script> --> <script src="../dist/main.js"></script>
3)配置打包的入口與出口
webpack 的 4.x 版本中默認約定:
若是要修改打包的入口與出口,能夠在 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' // 輸出文件的名稱 } }
注意:每次修改完配置文件的內容後,則必需要從新啓動服務器,不然不能生效。
4)配置 webpack 的自動打包功能
"scripts": { "dev": "webpack-dev-server" // script 節點下的腳本,能夠經過 npm run 執行 }
<!-- <script src="../dist/main.js"></script> --> <!-- <script src="../dist/bundle.js"></script> --> <script src="/bundle.js"></script>
注意:
5)配置 html-webpack-plugin 生成預覽頁面
項目跑起來以後,訪問網址後並無看到咱們但願的首頁,而是如上圖中的一層路徑,須要進入到src路徑下才能訪問。而咱們的需求是,只要訪問網站的根路徑,就能夠當即看到首頁,不須要人爲的點一下。
如何解決呢?只須要將src路徑下的首頁複製一份放到網站的根目錄下便可。由於咱們都知道,若是在瀏覽器中訪問一層路徑的話,這個路徑中若是包含一個index.html,則默認會打開這個頁面展現給用戶。
那如何將src裏面的index.html複製到網站根目錄下呢?須要使用html-webpack-plugin插件
// 導入生成預覽頁面的插件,獲得一個構造函數 const HtmlWebpackPlugin = require('html-webpack-plugin') const htmlPlugin = new HtmlWebpackPlugin({ // 建立插件的實例對象 template: './src/index.html', // 指定要用到的模板文件 filename: 'index.html' // 指定生成的文件的名稱,該文件存在於內存中,在目錄中不顯示 })
module.exports = { plugins: [ htmlPlugin ] // plugins 數組是 webpack 打包期間會用到的一些插件列表 }
6)配置自動打包相關的參數
當咱們啓動項目後,須要本身手動複製默認的網址localhost:8080,而後粘貼到瀏覽器中才能訪問頁面。如何在打包完成的一瞬間,自動彈開瀏覽器並去訪問該網址呢?
// package.json中的配置 // --open 打包完成後自動打開瀏覽器頁面 // --host 配置 IP 地址 // --port 配置端口 "scripts": { "dev": "webpack-dev-server --open --host 127.0.0.1 --port 8888" },
④ webpack 中的加載器
1)經過 loader 打包非 js 模塊
在實際開發過程當中,webpack 默認只能打包處理以 .js 後綴名結尾的模塊,其餘非 .js 後綴名結尾的模塊,webpack 默認處理不了,須要調用 loader 加載器才能夠正常打包,不然會報錯!
loader 加載器能夠協助 webpack 打包處理特定的文件模塊,好比:
2)loader 的調用過程
⑤ webpack 中加載器的基本使用
1)打包處理 css 文件
// 全部第三方文件模塊的匹配規則 module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'] } ] }
其中,test 表示匹配的文件類型,use 表示對應要調用的 loader
注意:
2)打包處理 less 文件
// 全部第三方文件模塊的匹配規則 module: { rules: [ { test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] } ] }
3)打包處理 scss 文件
// 全部第三方文件模塊的匹配規則 module: { rules: [ { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] } ] }
4)配置 postCSS 自動添加 css 的兼容前綴
const autoprefixer = require('autoprefixer') // 導入自動添加前綴的插件 module.exports = { plugins: [ autoprefixer ] // 掛載插件 }
module: { rules: [ { test:/\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] } ] }
5)打包樣式表中的圖片和字體文件
module: { rules: [ { test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/, use: 'url-loader?limit=16940' } ] }
其中 ? 以後的是 loader 的參數項。
limit 用來指定圖片的大小,單位是字節(byte),只有小於 limit 大小的圖片,纔會被轉爲 base64 圖片。圖片被轉成base64格式會在加載的時候更快一些。
而大於等於該limit大小的圖片,顯示的是真正的路徑:
6)打包處理 js 文件中的高級語法
module.exports = { presets: [ '@babel/preset-env' ], plugins: [ '@babel/plugin-transform-runtime', '@babel/plugin-proposalclass-properties’ ] }
// exclude 爲排除項,表示 babel-loader 不須要處理 node_modules 中的 js 文件 { test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }
3. Vue 單文件組件
① 傳統組件的問題和解決方案
問題:
解決方案:
針對傳統組件的問題,Vue 提供了一個解決方案 —— 使用 Vue 單文件組件。
② Vue 單文件組件的基本用法
單文件組件的組成結構:
<template> <!-- 這裏用於定義Vue組件的模板內容 --> <div> <h1>這是 App 根組件</h1> </div> </template> <script> // 這裏用於定義Vue組件的業務邏輯 export default { data: () { return {} }, // 私有數據 methods: {} // 處理函數 // ... 其它業務邏輯 } </script> <style scoped> /* 這裏用於定義組件的樣式 */ h1 { color: red; } </style>
③ webpack 中配置 vue 組件的加載器
const VueLoaderPlugin = require('vue-loader/lib/plugin') module.exports = { module: { rules: [ // ... 其它規則 { test: /\.vue$/, loader: 'vue-loader' } ] }, plugins: [ // ... 其它插件 new VueLoaderPlugin() // 請確保引入這個插件! ] }
④ 在 webpack 項目中使用 vue
// 1. 導入 Vue 構造函數 import Vue from 'vue' // 2. 導入單文件組件 App 根組件 import App from './components/App.vue' const vm = new Vue({ // 3. 指定 vm 實例要控制的頁面區域 el: '#app', // 4. 經過 render 函數,把指定的組件渲染到 el 區域中 render: h => h(App) })
注意,在webpack中使用Vue並非最全版本的,在該版本中的vue只支持使用render函數來渲染組件,不支持component屬性,也不支持template屬性。
⑤ 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", },
dist文件夾裏面的內容就是上線打包好的項目。
4. Vue 腳手架
① Vue 腳手架的基本用法
Vue 腳手架用於快速生成 Vue 項目基礎架構,其官網地址爲:https://cli.vuejs.org/zh/
使用步驟:
安裝 3.x 版本的 Vue 腳手架:
npm install -g @vue/cli
基於3.x版本的腳手架建立vue項目:
// 1. 基於 交互式命令行 的方式,建立 新版 vue 項目 vue create my-project // 項目名稱必須是英文的,不能包含中文或者其餘的特殊字符 // 2. 基於 圖形化界面 的方式,建立 新版 vue 項目 vue ui // 3. 基於 2.x 的舊模板,建立 舊版 vue 項目 npm install -g @vue/cli-init vue init webpack my-project
1)交互式命令行方式
使用vue create命令建立項目以後,會進入一個交互式的問答面板。
能夠經過上下箭頭來選擇。
默認方式建立項目 仍是 手動選擇某些功能而後再建立項目?
使用手動選擇以後會進入一個新面板。
若是要選擇router,則選中router對象,而後單擊一下空格就能夠打印出一個*,*表明要安裝這一項,若是是空的,則表示不安裝。
點擊回車進入到下一個面板。
是否安裝歷史模式的router?咱們推薦使用hash模式的路由,因此輸入n。
讓咱們選擇ESLint的語法類型,通常選擇standard config。
進入下一個面板,選擇何時進行ESLint語法規則校驗?默認選擇第一項。
這些Babel,PostCSS,ESLint等等一些工具的配置文件怎麼去進行建立?推薦選擇單獨配置文件
建立單獨的配置文件 仍是 把這些工具的配置文件都放到package.json文件中?
是否把當前咱們作過的一些選擇保存爲一個模板,供咱們後續再建立項目的時候直接選擇這個模板就好了,而不須要每次都本身選了
建立項目的過程當中:
項目建立完成以後,能夠進入該目錄中,而後運行npm run serve命令來運行該項目。
進入localhost:8080網址,就能夠看到建立好的vue項目
2)圖形化界面的方式
輸入vue ui命令後,會自動彈出一個圖形化界面
項目建立完成以後,會顯示一個項目儀表盤
啓動項目:
3)2.x的舊模板建立方式
輸入命令以後也會進入一個交互式界面。
依次按要求輸入:
正在建立項目基本結構:
啓動項目:
② Vue 腳手架生成的項目結構分析
③ Vue 腳手架的自定義配置
1)經過 package.json 配置項目
// 必須是符合規範的json語法 "vue": { "devServer": { "port": "8888", "open" : true // 自動彈出瀏覽器 } },
注意:不推薦使用這種配置方式。由於 package.json 主要用來管理包的配置信息;爲了方便維護,推薦將 vue 腳手架相關的配置,單獨定義到 vue.config.js 配置文件中。
2)經過單獨的配置文件配置項目
// vue.config.js module.exports = { devServer: { port: 8888 } }
5. Element-UI 的基本使用
Element-UI:一套爲開發者、設計師和產品經理準備的基於 Vue 2.0 的桌面端組件庫。
官網地址爲:http://element-cn.eleme.io/#/zh-CN
① 基於命令行方式手動安裝
// 導入組件庫 import ElementUI from 'element-ui'; // 導入組件相關樣式 import 'element-ui/lib/theme-chalk/index.css'; // 配置 Vue 插件 Vue.use(ElementUI);
② 基於圖形化界面自動安裝