VUE
Vue-router
基本使用步骤
- 引入相关的库文件
<!-- 导入 vue 文件,为全局 window 对象挂载 Vue 构造函数 -->
<script src="./lib/vue_2.5.22.js"></script>
<!-- 导入 vue-router 文件,为全局 window 对象挂载 VueRouter 构造函数 -->
<script src="./lib/vue-router_3.0.2.js"></script>
- 添加路由链接
<!-- router-link 是 vue 中提供的标签,默认会被渲染为 a 标签 -->
<!-- to 属性默认会被渲染为 href 属性 -->
<!-- to 属性的值默认会被渲染为 # 开头的 hash 地址 -->
<router-link to="/user">User</router-link>
<router-link to="/register">Register</router-link>
- 添加路由填充位
<!-- 路由填充位(也叫做路由占位符) -->
<!-- 将来通过路由规则匹配到的组件,将会被渲染到 router-view 所在的位置 -->
<router-view></router-view>
- 定义路由组件
var User = {
template: '<div>User</div>'
}
var Register = {
template: '<div>Register</div>'
}
- 配置路由规则并创建路由实例
// 创建路由实例对象
var router = new VueRouter({
// routes 是路由规则数组 routes: [
// 每个路由规则都是一个配置对象,其中至少包含 path 和 component 两个属性: // path 表示当前路由规则匹配的 hash 地址
// component 表示当前路由规则对应要展示的组件
{path:'/user',component: User},
{path:'/register',component: Register} ]
})
- 把路由挂载到 Vue 根实例中
new Vue({
el: '#app',
// 为了能够让路由规则生效,必须把路由对象挂载到 vue 实例对象上
router
});
嵌套路由
- 父路由组件模板
- 父级路由链接
- 父组件路由填充位
<p>
<router-link to="/user">User</router-link> <router-link to="/register">Register</router-link>
</p>
<div>
<!-- 控制组件的显示位置 -->
<router-view></router-view>
</div>
- 子级路由模板
- 子级路由链接
- 子级路由填充位
const Register = {
template: `<div>
<h1>Register 组件</h1>
<hr/>
<router-link to="/register/tab1">Tab1</router-link>
<router-link to="/register/tab2">Tab2</router-link>
<!-- 子路由填充位置 -->
<router-view/>
</div>`
}
- 嵌套路由配置
const router = new VueRouter({ routes: [
{ path: '/user', component: User },
{
path: '/register',
component: Register,
// 通过 children 属性,为 /register 添加子路由规则 children: [
{ path: '/register/tab1', component: Tab1 },
{ path: '/register/tab2', component: Tab2 } ]
} ]
})
动态路由
- 通过动态路由参数的模式进行路由匹配
var router = new VueRouter({ routes: [
// 动态路径参数 以冒号开头
{ path: '/user/:id', component: User } ]
})
const User = {
// 路由组件中通过$route.params获取路由参数
template: '<div>User {{ $route.params.id }}</div>'
}
- 路由组件传递参数
const router = new VueRouter({ routes: [
// 如果 props 被设置为 true,route.params 将会被设置为组件属性
{ path: '/user/:id', component: User, props: true } ]
})
const User = {
props: ['id'], // 使用 props 接收路由参数
template: '<div>用户ID:{{ id }}</div>' // 使用路由参数
}
动态路由匹配
- props的值为对象类型
const router = new VueRouter({ routes: [
// 如果 props 是一个对象,它会被按原样设置为组件属性
{ path: '/user/:id', component: User, props: { uname: 'lisi', age: 12 }} ]
})
const User = {
props: ['uname', 'age'],
template: ‘<div>用户信息:{{ uname + '---' + age}}</div>'
}
- props的值为函数类型
const router = new VueRouter({ routes: [
// 如果 props 是一个函数,则这个函数接收 route 对象为自己的形参 { path: '/user/:id',
component: User,
props: route => ({ uname: 'zs', age: 20, id: route.params.id })} ]
})
const User = {
props: ['uname', 'age', 'id'],
template: ‘<div>用户信息:{{ uname + '---' + age + '---' + id}}</div>'
}
命名路由
const router = new VueRouter({ routes: [
{
path: '/user/:id',
name: 'user',
component: User
} ]
})
<router-link :to="{ name: 'user', params: { id: 123 }}">User</router-link>
router.push({ name: 'user', params: { id: 123 }})
编程式导航
- 声明式导航:通过点击链接实现导航的方式,叫做声明式导航
例如:普通网页中的 链接 或 vue 中的 - 编程式导航:通过调用JavaScript形式的API实现导航的方式,叫做编程式导航
例如:普通网页中的 location.href
- 基本用法
- this.$router.push(‘hash地址’)
- this.$router.go(n)
- 参数规则
// 字符串(路径名称)
router.push('/home')
// 对象
router.push({ path: '/home' })
// 命名的路由(传递参数)
router.push({ name: '/user', params: { userId: 123 }})
// 带查询参数,变成 /register?uname=lisi
router.push({ path: '/register', query: { uname: 'lisi' }})
Vue前端工程化
模块化规范
- 模块化就是把单独的一个功能封装到一个模块(文件)中,模块之间相互隔离,但是可以通过特定的接口公开内部成 员,也可以依赖别的模块
- 模块化开发的好处:方便代码的重用,从而提升开发效率,并且方便后期的维护
- 服务器端模块化规范 CommonJS
- 模块分为 单文件模块 与 包
- 模块成员导出:module.exports 和 exports
- 模块成员导入:require(‘模块标识符’)
- 大一统的模块化规范 – ES6模块化
在 ES6 模块化规范诞生之前,Javascript 社区已经尝试并提出了 AMD、CMD、CommonJS 等模块化规范。但是,这些社区提出的模块化标准,还是存在一定的差异性与局限性、并不是浏览器与服务器通用的模块化标准,例如:AMD 和 CMD 适用于浏览器端的 Javascript 模块化;CommonJS 适用于服务器端的 Javascript 模块化。因此,ES6 语法规范中,在语言层面上定义了 ES6 模块化规范,是浏览器端与服务器端通用的模块化开发规范。ES6模块化规范中定义:每个 js 文件都是一个独立的模块;导入模块成员使用 import 关键字 ;暴露模块成员使用 export 关键字- Node.js 中通过 babel 体验 ES6 模块化
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
npm install --save @babel/polyfill
- 项目跟目录创建文件 babel.config.js
- babel.config.js 文件内容如下代码
- 通过 npx babel-node index.js 执行代码
- Node.js 中通过 babel 体验 ES6 模块化
const presets = [ ["@babel/env", {
targets: {
edge: "17", firefox: "60", chrome: "67", safari: "11.1"
} }]
];
module.exports = { presets };
webpack
webpack 是一个流行的前端项目构建工具(打包工具),可以解决当前 web 开发中所面临的困境:文件依赖关系错综复杂;静态资源请求效率低;模块化支持不友好;浏览器对高级 Javascript 特性兼容程度较低
webpack 提供了友好的模块化支持,以及代码压缩混淆、处理 js 兼容问题、性能优化等强大的功能,从而让程序员把 工作的重心放到具体的功能实现上,提高了开发效率和项目的可维护性。
基本使用
-
创建列表隔行变色项目
- 新建项目空白目录,并运行
npm init –y
命令,初始化包管理配置文件 package.json - 新建 src 源代码目录
- 新建 src -> index.html 首页
- 初始化首页基本的结构
- 运行 npm install jquery –S 命令,安装 jQuery 6 通过模块化的形式,实现列表隔行变色效果
- 新建项目空白目录,并运行
-
在项目中安装和配置 webpack
- 运行
npm install webpack webpack-cli –D
命令,安装 webpack 相关的包 - 在项目根目录中,创建名为 webpack.config.js 的 webpack 配置文件
- 在 webpack 的配置文件中,初始化如下基本配置:
- 在 package.json 配置文件中的 scripts 节点下,新增 dev 脚本如下
- 在终端中运行
npm run dev
命令,启动 webpack 进行项目打包。
- 运行
module.exports = {
mode: 'development' // mode 用来指定构建模式
}
"scripts": {
"dev": "webpack" // script 节点下的脚本,可以通过 npm run 执行
}
- 配置打包的入口与出口
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 命令如下: - 将 src -> index.html 中,script 脚本的引用路径,修改为 "/buldle.js“
- 运行
npm run dev
命令,重新进行打包 - 在浏览器中访问 http://localhost:8080 地址,查看自动打包效果
- 运行
"scripts": {
"dev": "webpack-dev-server" // script 节点下的脚本,可以通过 npm run 执行
}
注意⚠️:webpack-dev-server 会启动一个实时打包的 http 服务器;webpack-dev-server 打包生成的输出文件,默认放到了项目根目录中,而且是虚拟的、看不见的
- 配置 html-webpack-plugin 生成预览页面
- 运行
npm install html-webpack-plugin –D
命令,安装生成预览页面的插件 - 修改 webpack.config.js 文件头部区域,添加如下配置信息:
- 修改 webpack.config.js 文件中向外暴露的配置对象,新增如下配置节点:
- 运行
// 导入生成预览页面的插件,得到一个构造函数
const HtmlWebpackPlugin = require('html-webpack-plugin') const htmlPlugin = new HtmlWebpackPlugin({ // 创建插件的实例对象
template: './src/index.html', // 指定要用到的模板文件
filename: 'index.html' // 指定生成的文件的名称,该文件存在于内存中,在目录中不显示 })
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" },
webpack 中的加载器
- 通过 loader 打包非 js 模块
在实际开发过程中,webpack 默认只能打包处理以 .js 后缀名结尾的模块,其他非 .js 后缀名结 尾的模块,webpack 默认处理不了,需要调用 loader 加载器才可以正常打包,否则会报错!loader 加载器可以协助 webpack 打包处理特定的文件模块,比如:- less-loader 可以打包处理 .less 相关的文件
- sass-loader 可以打包处理 .scss 相关的文件
- url-loader 可以打包处理 css 中与 url 路径相关的文件
- 打包处理 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,并初始化如下配置:
- 在 webpack.config.js 的 module -> rules 数组中,修改 css 的 loader 规则如下:
- 运行
const autoprefixer = require('autoprefixer') // 导入自动添加前缀的插件 module.exports = {
plugins: [ autoprefixer ] // 挂载插件 }
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
- 安装babel语法插件相关的包:
- 在项目根目录中,创建 babel 配置文件 babel.config.js 并初始化基本配置如下:
- 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:
- 安装babel转换器相关的包:
npm i @babel/preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties –D
module.exports = {
presets: [ '@babel/preset-env' ],
plugins: [ '@babel/plugin-transform-runtime', '@babel/plugin-proposal-
class-properties’ ] }
// exclude 为排除项,表示 babel-loader 不需要处理 node_modules 中的 js 文件
{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }
vue 单文件组件
- 单文件组件的组成结构:template 组件的模板区域 ;script 业务逻辑区域 ;style 样式区域
- 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() // 请确保引入这个插件!
] }
- 在 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 './components/App.vue'
const vm = new Vue({
// 3. 指定 vm 实例要控制的页面区域
el: '#app',
// 4. 通过 render 函数,把指定的组件渲染到 el 区域中 render: h => h(App)
})
- 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 脚手架
- 安装 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
- Vue 脚手架的自定义配置
- 通过 package.json 配置项目
- 通过单独的配置文件配置项目:在项目的跟目录创建文件 vue.config.js;在该文件中进行相关配置,从而覆盖默认配置
// 必须是符合规范的json语法 "vue": {
"devServer": { "port": "8888", "open" : true
} },
//不推荐使用这种配置方式。因为 package.json 主要用来管理包的配置信息;为了方便维护,推荐将 vue 脚 手架相关的配置,单独定义到 vue.config.js 配置文件中。
// vue.config.js module.exports = {
devServer: {
port: 8888
} }
Element-UI 的基本使用
- 基于命令行方式手动安装
- 安装依赖包
npm i element-ui –S
- 导入 Element-UI 相关资源
- 安装依赖包
// 导入组件库
import ElementUI from 'element-ui';
// 导入组件相关样式
import 'element-ui/lib/theme-chalk/index.css'; // 配置 Vue 插件
Vue.use(ElementUI);
- 基于图形化界面自动安装
- 运行 vue ui 命令,打开图形化界面
- 通过 Vue 项目管理器,进入具体的项目配置面板
- 点击 插件 -> 添加插件,进入插件查询面板
- 搜索 vue-cli-plugin-element 并安装
- 配置插件,实现按需导入,从而减少打包后项目的体积
VUE项目初始化
- 安装Vue脚手架
- 通过脚手架创建项目
- 通过可视化面板GUI形式创建项目:
vue ui
- 通过可视化面板GUI形式创建项目:
- 配置Vue路由
- 配置Element-UI组件库:vue_cli_plugin_element
- 配置axios库
- 配置less库:less+less_loader
- 初始化git远程仓库
- 将本地项目托管到git中