简介
开发工具
VSCode, WebStorm 。。。
可以使用自己喜欢的任意开发工具或者文本编辑器
开发环境
Node.js, Npm, Cnpm, Webpack, ES6
框架
Vue.js, Element UI
基础概念
Node.js
Node.js是一个Javascript运行环境(runtime)。实际上它是对Google V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。
Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
npm
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
cnpm
CNPM是淘宝的NPM镜像,由于在国内网络环境访问NPM不便,所以用CNPM代替NPM
Webpack
Webpack 是当下最热门的前端资源模块化管理和打包工具。它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分隔,等到实际需要的时候再异步加载。通过 loader 的转换,任何形式的资源都可以视作模块,比如 CommonJs 模块、 AMD 模块、 ES6 模块、CSS、图片、 JSON、Coffeescript、 LESS 等。
ES6
CMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。
Vue.js
vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用。
Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
Element UI
由饿了吗开源,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,帮助你的网站快速成型。
vue-cli脚手架
npm install --global vue-cli//安装vuecli脚手架
vue init webpack myproject//使用webpack构建
cd myproject//进入初始化的项目目录
npm install//安装项目package.json使用到到组件插件
npm run dev//运行项目
npm run build//打包编译项目,打包成功后,生成dist目录
ps:需要先安装nodejs
开发工具vscode
- 安装vscode
- 安装Vurtur插件//vue在vscode上的工具
- 配置vue代码片段 文件==》首选项==》用户代码片段//配置完代码片段后,只需要输入vuec,代码片段自动输入到.vue文件中
{
"Print to console": {
"prefix": "log",
"body": [
"console.log('$1');",
"$2"
],
"description": "Log output to console"
},
"Create vue template": {
"prefix": "vuec",
"body": [
"<template>",
" <div>",
" </div>",
"</template>",
"<script>",
"export default {",
" name: '${1:component_name}',",
" directives: {},",
" components: {},",
" data () {",
" return {}",
" },",
" props: {},",
" computed: {},",
" watch: {},",
" methods: {},",
" beforeCreate () {},",
" created () {},",
" destroyed () {},",
" mounted () {}",
"}",
"</script>",
"<style lang='${2:postcss}'>",
"</style>",
""
],
"description": "Create vue template"
}
}
- 配置eslint,根目录 .eslintrc.js 到 rule下面配置
"quotes": [
"off"
],
"semi": [
"warn",
"always"
],
"space-before-function-paren": [
"error",
"never"
]
webpack
/build/webpack.base.conf.js
- 增加别名,
'@utils': resolve('src/utils')//resolve.alias对象添加该属性
//新增完别名,import的时候就可以使用别名,快速定位路径
import test from "@utils/utils.js";//即进入 /src/utils/utils.js
- 设置图片资源转base64规则
module.rules
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,// 图片大小限制 单位b
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
}
优点:讲小图标等静态资源转成静态base64数据,减少网络请求次数,降低服务器压力
/config/index.js
- 配置host ip autoOpenBrowser(是否自动打开浏览器)
//dev下 开发环境配置
host: '10.8.117.75',
port: 8080,
autoOpenBrowser: false,
- 配置打包编译输出目录
//build下
assetsRoot: path.resolve(__dirname, '../dist'),//构建输出目录 也就是构建后的东西都扔这里
assetsSubDirectory: 'static',//资源子目录 除了index.html,其余的js img css都分在这里
assetsPublicPath: '/',//以当前根目录(/)为项目目录
ES6转ES5
install babel-polyfillnpm install --save babel-polyfill
修改webpack.base.conf.js
entry: {
// app: './src/main.js'
app: ['babel-polyfill', './src/main.js']
},
vuex状态管理器
- 引入
在src下建立store目录,新增store.js
import Vue from 'vue';
import Vuex from 'vuex';
import test from '@/store/test';// 状态管理器可以设置子模块,通过在modules引入即可。
Vue.use(Vuex);
const store = new Vuex.Store({
state: {// 状态管理器的属性
count: 0
},
actions: {// 调用一个或者多个mutations操作state,通过store.dispatch("")
doChangeState(context, obj) { // 也可以使用{commit}
console.log("context", context);
console.log("obj", obj);
context.commit("changeState", obj.count);
}
},
mutations: {// 执行操作state的方法
changeState(state, obj) { // 这边只有2个参数,调用commit("changeState",obj);只能传一个参数,可以为对象
state.count = obj;
}
},
getters: {
// 在Store仓库里,state就是用来存放数据,若是对数据进行处理输出,比如数据要过滤,一般我们可以写到computed中。但是如果很多组件都使用这个过滤后的数据,比如饼状图组件和曲线图组件,我们是否可以把这个数据抽提出来共享?这就是getters存在的意义。我们可以认为,【getters】是store的计算属性。
getProductByid: (state) => (id) => {// 多个箭头函数语法,底下有解释
return state.productList.find(item => item.id === id);// 等同于find(item,index,obj){return item.id === id}
}
},
modules: {
test
}
});
// getProductByid: (state) => (id) =>{
// }
// function getProductByid(state) {
// return function(id) {
// }
// }
// var getProductByid = getProductByid(state);
// getProductByid(id)
export default store;
根目录的main.js,添加vuex的引用
import Vuex from 'vuex';
Vue.use(Vuex);
- vuex状态管理器使用
import store from "@/store/store.js";
import { mapState } from "vuex";// mapState、mapGetters、mapActions状态管理器的三种辅助函数
computed: {
oldTest: () => {
console.log("oldTest");
// test的值变化,computed会再次执行,
// 如果return 的是对象, 则不会再次执行
return JSON.stringify(store.state.test);
},
...mapState({
test: state => {
return state.test;
}
})
},
route路由的使用
- route引入
- 在src下建立router目录,新增index.js
import Vue from 'vue';
import Router from 'vue-router';
import HelloWorld from '@/components/HelloWorld';
Vue.use(Router);
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld
},
{
path: '/:id',
name: 'HelloWorld',
component: HelloWorld
}
]
});
- 在main.js引入router
import router from './router';// ./router(相对路径) 表示进入/src/router/index.js(index.js是缺省的)
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
});
- 在根目录App.vue组件内加入标签
<div id="app" v-cloak>
<transition>
<router-view/>
</transition>
</div>
transition为路由过度动画
- 路由操作
引入后即可在任何组件内通过this. router操作路由,或者this. r o u t e r 操 作 路 由 , 或 者 t h i s . route访问当前路由
- 路由跳转
//路由跳转有两种形式
<router-link :to="...">
router.push(...)
- 路由传参
- params
在route.js配置path,:加上需要传递的param,通过this.$router.push传递对应路径
{
path: '/:id',
name: 'HelloWorld',
component: HelloWorld
}
this.$router.push({
path: "/" + id
});
通过name匹配对应的路由,在params里面直接传入参数
this.$router.push({
name: "HelloWorld",
params: {
id: id
}
});
- query
this.$router.push({
path: '/HelloWorld',
query: {
id: id
}
})
这种情况下 query传递的参数会显示在url后面?id=?
- 路由懒加载
通过路由同一管理页面当页面量大的时候,打包构建应用的时候JavaScript包会非常大影响加载。
结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。
- 添加 syntax-dynamic-import 插件
npm install --save-dev @babel/plugin-syntax-dynamic-import
- webpack.base.conf.js添加配置
chunkFilename: '[name].js',//webpack.base.conf.js output下新增chunkFilename属性
- 定义异步组件
<template>
<div>
这个是个异步组件,同一个chunkName的组件会被一起加载。
</div>
</template>
<script>
const TestAsync = {
name: "testAysn",
directives: {},
components: {},
data() {
return {};
},
props: {},
computed: {},
watch: {},
methods: {},
beforeCreate() {
console.log("beforeCreate");
},
created() {
console.log("created");
},
destroyed() {
console.log("destroyed");
},
mounted() {
console.log("异步组件mounted", this);
console.log("route的param", this.$route.params);
}
};
export default TestAsync;
</script>
<style lang='postcss'>
</style>
- 路由加载异步组件
const TestAsync = () => import(/* webpackChunkName: "TestAsync" */ '@/components/TestAsync');
export default new Router({
routes: [
{
path: '/',
name: 'HelloWorld',
component: HelloWorld
},
{
path: '/TestAsync/:id', // 带有:
name: 'TestAsync',
component: TestAsync
}
]
});
const TestAsync = () => import(/* webpackChunkName: "TestAsync" */ '@/components/TestAsync');
其中webpackChunkName为异步组件打包在名字,同样的webpackChunkName会被打包在一起,只加载一次
axios
npm install axios
- promise
参考下网上的文档,理解下promise的必要性
- 从浏览器中创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求数据和响应数据
- 取消请求
- 自动转换 JSON 数据
- 客户端支持防御 XSRF
Promise最大的好处是在异步执行的流程中,把执行代码和处理结果的代码清晰地分离了
Axios是一个基于promise的HTTP库,可以用在浏览器和node.js 中。(在前后端分离的服务端渲染中,axios能在浏览器和node中执行,至关重要)
开发环境配置proxyTable,临时允许跨域请求
/config/index.js=>dev下,修改proxyTable属性
proxyTable: {
'/test': {
target: 'https://www.zhongxiangliquan.com/index.php/home/program/joinshop?openid=1&session_key=1', // 接口的域名
secure: false, // 如果是https接口,需要配置这个参数
changeOrigin: true, // 如果接口跨域,需要进行这个参数配置
pathRewrite: {
'^/test': ''
}
}
},
import axios from "axios";
new Promise(resolve => {
setTimeout(() => {
resolve("timeout");
}, 2000);
})
.then((res) => {
console.log(res);// timeout
return axios.get(// axios.get返回的是一个promise对象
"/test"
);
})
.then(response => console.log(response))
.catch(error => console.log(error));
elementui
npm i element-ui -S
- 按需引入elementui组件
借助 babel-plugin-component,我们可以只引入需要的组件,以达到减小项目体积的目的。
npm install babel-plugin-component -D
然后,将 .babelrc 修改为:
{
"presets": [["es2015", { "modules": false }]],
"plugins": [
// 只需要在原有的.babelrc文件添加如下
[
"component",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
]
]
}
- 完整引入
在main.js文件添加elementui
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
- 使用elementui
参考elementui官网文档,即可使用对应UI组件
<el-row>
<el-button>默认按钮</el-button>
<el-button type="primary">主要按钮</el-button>
<el-button type="success">成功按钮</el-button>
<el-button type="info">信息按钮</el-button>
<el-button type="warning">警告按钮</el-button>
<el-button type="danger">危险按钮</el-button>
</el-row>