前端工程化
1.模块化相关规范
1.1 ES6模块化基本语法
默认导出与默认导入
//默认导出语法 export default 默认导出的成员
export default {
a,c,show
}
//默认导入语法 import 接收名称 from ‘模块标识符’
import m1 from './m1.js';
按需导出与按需导入
//按需导出语法
export let s1 = 10;
export function say = function(){}
//按需导入语法
import { s1,s2 as ss2, say } from './m1.js'
按需导入可以有多次
直接导入并执行模块代码
import ‘./m2.js’
2.webpack用法
webpack是一个前端项目的构建工具(打包工具)
webpack提供了友好的模块化支持,以及代码压缩混淆、处理js兼容性问题,性能优化等强大功能。从而提高代码开发的效率和项目的可维护性
在项目中安装和配置webpack
-1. 安装与配置
npm install webpack webpack-cli -D
-2. 创建文件
创建名为 webpack.config.js 的 webpack 配置文件
-3. 编辑配置文件
module.exports = {
mode: ‘development’ //mode用来指定构建模式,development/production
}
-4. 配置 package.json 配置文件
“scripts”:{
“dev”: “webpack” // script 节点下的脚本,可通过 npm run 执行
}
-5. 启动 webpack 进行项目打包
npm run dev
-6. 源文件放在src目录下, 打包后的文件放在dist目录下
配置打包的入口与出口
配置自动打包功能
-1. 安装自动打包的工具
npm install webpack-dev-server -D
-2. 修改 package.json -> scripts 中的 dev 命令
“scripts”:{
“dev”: ‘webpack-dev-server’ //script 节点下的脚本
}
-3. 将 src -> index.html 中,script脚本的引用路径修改为 "/buldle.js"
-4. 运行
npm run dev
-5. 访问
http://localhost:8080
配置 html-webpack-plugin 生成预览页面
-1. 运行,安装生成预览页面的插件
npm install html-webpack-plugin -D
-2. 修改 webpack.config.js文件头部区域,添加配置信息
// 导入生成预览页面的插件,得到一个构造函数
const HtmlWebpackPlugin = require('html-webpack-plugin')
const htmlPlugin = new HtmlWebpackPlugin({ //创建插件的实例对象
template: './src/index.html', //指定要得到的模板文件
//指定生成的文件的名称,该文件存在于内存中,在目录不显示
filename: 'index.html'
})
-3. 修改 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"
},
webpack中的加载器
-1. 通过loader 打包非js模块
在实际开发中,webpack默认只能打包处理 .js 后缀名结尾的模块,其他的非 .js 后缀结尾的模块,webpack 默认处理不了,需要调用 loader 加载器才能正常打包
loader 加载器可以协助 webpack 打包处理特定的文件模块
less-loader 打包处理 .less相关的文件
sass-loader 打包处理 .scss相关的文件
url-loader 打包处理 css中与 url 路径相关的文件
-2. 安装与配置打包处理css文件
npm i style-loader css-loader -D
-3. 配置,在 webpack.config.js 的 module -> rules 数组中,添加
//所有第三方文件模块的匹配规则,test 表示匹配的文件类型, use 表示对应的loader
module:{
rules: [
{ test:/\.css$/, use: ['style-loader','css-loader']}
]
}
3.Vue 单文件组件
单文件模板
这里用于定义vue组件的模板内容在 webpack 项目中使用 vue
-1. 运行,安装
npm i vue -S
-2. 在 src -> index.js 入口文件中,通过 import Vue from ‘vue’ 来导入vue构造函数
-3. 创建 vue 实例函数,并指定要控制的 el 区域
-4. 通过 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 打包发布
```javascript
// 在package.json文件中配置 webpack 打包文件
// 该命令默认加载项目根目录中的 webpack.config.js 配置文件
"scripts": {
// 用于打包的命令
"build": "webpack -p",
// 用于开发调试的命令
"dev": "webpack-dev-server --open --host 127.0.0.1 --post 3000",
}
//打包
npm run build
4.Vue 脚手架
Vue 脚手架用于快速生成项目基础架构
//使用步骤
-1. 安装 3.X版本, CMD
npm install -g @vue/cli
vue -V
-2. 基于 交互式命令行 的方式 创建 新版 vue 项目
vue create my-project
-3. 基于 图形化界面 的方式,创建 新版 vue 项目
vue ui
-4. 基于 2.x的旧版本,创建旧版本的 vue项目
npm install -g @vue/cli-init
vue init webpack my-project
//配置事项
Use history mode for router? n
Pick a linter / formatter config: ESLint + Standard config
Pick additional lint features: (*) Lint on save
Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
通过 package.json 自定义配置项目
//必须是符合规范的json语法,不推荐
“vue”: {
“devServer”:{
“port”: “8888”,
“open”: true
}
}
通过单独的配置文件配置项目
// 在项目的根目录中创建文件 vue.config.js ,推荐
// 在该文件中进行相关的配置,从而覆盖默认配置
// vue.config.js
module.export = {
devServer: {
open: true
port: 8888
}
}
5.Element-UI 的基本使用
Element-UI是一套 基于 Vue 2.0 的桌面端组件库
-1. 使用,基于命令行方式手动安装
//安装依赖包
npm i element-ui -S
//main.js中写入
//导入相关资源 main.js中引入
import ElementUI from ‘element-ui’;
import ‘element-ui/lib/theme-chalk/index.css’;
//配置 Vue 插件
Vue.use(ElementUI)
//按需使用
复制组件源码到使用页面
-2. 基于图形化界面安装
界面配置后
//main.js中写入
import ‘./plugins/element.js’
//element.js
import Vue from ‘vue’
import Element from ‘element-ui’
import ‘element-ui/lib/theme-chalk/index.css’
import { Form, FormItem, Input, Button, Message } from ‘element-ui’
Vue.use(Element)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
Vue.use(Button)
Vue.prototype.$message = Message //挂载到原型对象
配置 axios 库
//配置 axios 库
npm install axios -S
//在src/main.js里面配置axios
import axios from ‘axios’;
//配置请求的根路径
axios.defaults.baseURL = ‘http://www.baidu.com’
Vue.use(axios)
Vue.prototype.$http = axios;
new Vue({
router,
axios,
el: ‘#app’,
render: h => h(App)
})
初始化 git 远程仓库和操作
//在 github新建一个仓库
//本地CMD
git status
git add .
git commit -m “add files”
git status
git remote add origin https://github.com/Holsen-Bakey/vue_shop.git
git push -u origin master //本地master分支推送至云端,首次
git checkout -b login //新建一个分支login,并切换到
git branch
git status
git add . //把所有代码提交到暂存区
git status
git commit -m ‘完成登陆功能开发’
git branch
git checkout master //切换回master分支
git merge login //将login分支的文件合并到mater主分支
git push //本地master推送至云端
git checkout login //切换回login分支
git branch
git puch -u origin login //本地login分支推送至云端,首次
git checkout -b user //新建一个分支user,并切换到
git branch
git status
git add . //提交修改到user分支
git commit -m ‘完成用户列表开发’ //把user分支提交到仓库
git status
git push -u origin user //本地user分支推送至云端,首次
git checkout master
git merge user
git push //将master分支推送到云端
/* 先把写完的分项目代码提交到一个新的分支并上传,再合并到主分支并上传*/
git branch
git checkout -b rights
git branch
git push -u origin rights
git branch
git add .
git commit -m ‘完成了权限功能’
git push
git checkout master
git merge rights
git push
6.综合项目
电商后台管理系统
技术栈:
综述
补充知识点
//1.路由导航守卫控制访问权限
//如果用户没有登陆,但是直接通过URl访问特定页面,需要重新导航到登陆页面
//为路由对象,添加 beforeEach 导航守卫
router.beforeEach((to,from,next)=>{
// to 将要访问的路径,from 代表从那个路径跳转而来
// next 是一个函数,表示放行, next()放行 next(’/login’) 强制跳转
//如果用户访问的登录页,直接放行
if (to.path === ‘/login’) return next()
//从 sessionStorage 中获取保存的 token 值
const tokenStr = window.sessionStorage.getItem(‘token’)
//没有 token,强制跳转到登录页
if (!tokenStr) return next(’/login’);
next()
})
//2. 格式化满足eslint
创建 .prettierrc 文件
{
“semi”: false,
“singleQuote”: true,
“printWidth”: 200
}
//3.axios 请求拦截器添加 token
//axios 请求拦截,预处理请求
axios.interceptors.request.use(config => {
// 为请求头对象,添加 Token 验证的 Authorization 字段
config.headers.Authorization = window.sessionStorage.getItem(‘token’)
return config
})
图形界面安装项
//依赖项
—运行依赖
axios
echarts
nprogress
---开发依赖
less-loader
less
babel-plugin-transform-remove-console
//插件项
vue-cli-plugin-element
7.项目笔记
App.vue 文件
//代码
main.js 文件
//代码
import Vue from ‘vue’
import App from ‘./App.vue’
import router from ‘./router’
import store from ‘./store’
import ‘./plugins/axios’
import ‘./plugins/element.js’
import ‘./assets/css/global.css’ // 导入全局样式表,初始化
import axios from ‘axios’
Vue.use(axios)
//配置请求的根路径
axios.defaults.baseURL = ‘http://www.baidu.com’
//axios 请求拦截,预处理请求,请求拦截器添加 token
axios.interceptors.request.use(config => {
config.headers.Authorization = window.sessionStorage.getItem(‘token’)
return config
})
Vue.prototype.$http = axios;
Vue.config.productionTip = false
new Vue({
router,
store,
render: h => h(App)
}).$mount(’#app’)
router/index.js 路由模块文件
//代码
import Vue from ‘vue’
import VueRouter from ‘vue-router’
import Login from ‘…/components/login.vue’
import Home from ‘…/components/Home.vue’
import Welcome from ‘…/components/Welcome.vue’
import Users from ‘…/components/user/Users.vue’
import Rights from ‘…/components/power/Rights.vue’
import Roles from ‘…/components/power/Roles.vue’
Vue.use(VueRouter)
const router = new VueRouter({
routes: [{
path: ‘/’,
redirect: ‘/login’ //设置默认主页’/'的跳转
},
{
path: ‘/login’,
component: Login
},
{
path: ‘/home’,
component: Home,
redirect: ‘/welcome’,
children: [
{ path: ‘/welcome’, component: Welcome },
{ path: ‘/users’, component: Users },
{ path: ‘/rights’, component: Rights },
{ path: ‘/roles’, component: Roles }
]
}
]
})
//挂载路由导航守卫,控制访问权限
router.beforeEach((to, from, next) => {
if (to.path === ‘/login’) return next();
//从 sessionStorage 中获取保存的 token 值
const tokenStr = window.sessionStorage.getItem(‘token’)
//没有 token,强制跳转到登录页
if (!tokenStr) return next(’/login’)
next()
})
export default router
/element.vue文件
import Vue from ‘vue’
import Element from ‘element-ui’
import ‘element-ui/lib/theme-chalk/index.css’
import { Form, FormItem, Input, Button, Message, Container, Header, Main, Aside, Menu, Submenu, MenuItemGroup, MenuItem, Breadcrumb,BreadcrumbItem,Card,Row,Col,Table,TableColumn,Switch,
Tooltip,Pagination,Dialog,MessageBox,Tag,Tree} from ‘element-ui’
Vue.use(Element)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
Vue.use(Button)
Vue.use(Container)
Vue.use(Header)
Vue.use(Main)
Vue.use(Aside)
Vue.use(Menu)
Vue.use(Submenu)
Vue.use(MenuItemGroup)
Vue.use(MenuItem)
Vue.prototype. m e s s a g e = M e s s a g e / / 挂 载 到 原 型 对 象 , 全 局 使 用 V u e . p r o t o t y p e . message = Message //挂载到原型对象,全局使用 Vue.prototype. message=Message//挂载到原型对象,全局使用Vue.prototype.confirm = MessageBox.confirm
/Home.vue 文件