vue-cli 是 vue 脚手架,帮我们自动构建基本的项目结构。
//安装webpack
cnpm i webpack -g
安装vue-cli
cnpm i vue-cli -g
//生成详细项目模板
vue init webpack
//生成简单项目模板、比上面那个少了 eslint 和 单元测试
vue init webpack-simple
生成模板后。再通过下面命令,安装相关依赖包
cnpm install
axios 是一个基于promise 的 HTTP 库,可以用在浏览器和 node.js 中。
XMLHttpRequests
Vue 是一个渐进式 JavaScript 框架。严格来说 Vue 不是一个框架,只是和他旁边的生态环境组成了一个框架。
一个vue渐进式框架一般由下面几部分构成:
Vue 著名的全家桶其实就是,vue-router,vuex,axios,vue-cli。就是一个完整vue项目的核心构成。
同时调试方面,可以选择安装chrome 插件vue Devtools 。
Vue 只兼容IE9 及以上版本。
Vue 提供一个强大的过渡效果系统,可以在 Vue 插入/更新/移除元素时自动应用过渡效果。
Mustache 语法(双大括号)提供了完全的JavaScript支持,即可以在双大括号内写单个模板表达式。最终会会将数据解释为普通文本。
模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如 Math
和 Date
。你不应该在模板表达式中试图访问用户定义的全局变量。
v-html 则可以输出真正的 HTML
你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致XSS攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值。
:
绑定属性,class,id,style,src 等,父子组件绑定props里的数据@
事件绑定<div id="app-7">
<ol>
<todo-item
v-for="item in groceryList"
v-bind:todo="item"
v-bind:key="item.id">
</todo-item>
</ol>
</div>
Vue.component('todo-item', {
props: ['todo'],
template: '<li></li>'
})
var app7 = new Vue({
el: '#app-7',
data: {
groceryList: [
{ id: 0, text: '蔬菜' },
{ id: 1, text: '奶酪' },
{ id: 2, text: '随便其它什么人吃的东西' }
]
}
})
所有的 Vue 组件都是 Vue 实例,并且接受相同的选项对象 (一些根实例特有的选项除外)。
唯一的例外是使用Object.freeze()
,这会阻止修改现有的属性,也意味着响应系统无法再追踪变化。
除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法。它们都有前缀 $
,以便与用户定义的属性区分开来。例如:
let vm = new Vue({
el:'#example',
data:{
name:'wang',
message:'do something',
},
})
vm.$el = document.querySelector('#example');//true
### 7、生命周期勾子函数
beforeCrete 实例开始创建,此时,$el 和 data 都为 undefined,没有初始化
created 实例创建完毕,创建后 data 初始化了,而 $el 没有
beforeMount 挂载之前,$el 和 data 都初始化了,但 data 还没挂载到 dom
mounted Vue 实例挂载完毕
beforeUpdate 组件更新之前
updated 组件更新完毕
beforeDestroy 组件销毁前,组件销毁的意思是组件与 dom 解耦
destroyed 组件销毁完成
在对应的阶段希望做什么处理,就可以利用钩子函数,例如:
beforeCreate : 举个栗子:可以在这加个loading事件
created :在这结束loading,还做一些初始化,实现函数自执行
mounted : 在这发起后端请求,拿回数据,配合路由钩子做一些事情
beforeDestory: 你确认删除XX吗?
destoryed :当前组件已被删除,清空相关内容
这篇文章主要讲述 Promise 、async-await 的使用。详细的解析可以搜索阮一峰的 ES6 教程。
Promise 是异步编程的解决方案。相比传统直接使用回调函数的方式要更加易读,易写。
async-await 是 Promise 和 generator 的语法糖。只是为了让我们的代码更易写,易读。
使用 new
来调用 Promise
,返回的是一个 Promise
对象:
let p1 = new Promise((resolve, reject) => {
//异步处理
//处理结束,判断调用 resolve,还是 reject ,当调用其中一个的时候,后面的代码不再执行
});
设置回调函数使用 then
方法:
p1.then(func1,func2);//func1,func2 分别对应 resolve, reject 所调用的回调函数
不过通常使用 then
来处理 resolve
,catch
来处理 reject
,这样看起来更清晰
p1.then(func1).catch(func2);
多个请求并行,全部请求成功时执行某些代码,可用 Promise.all()
方法:
多个请求并行,有一个请求成功时执行某些代码,可用 Promise.race()
方法:
function createPromise(time, str) {
return new Promise((resolve, reject) => {
setTimeout(resolve, time, str);
});
}
let p1 = createPromise(600,'第一个');
let p2 = createPromise(400,'第二个');
let p3 = createPromise(1500,'第三个');
Promise.all([p1,p2,p3]).then(data => {
console.log(`${data[0]}${data[1]}${data[2]}`);//第一个第二个第三个
});
Promise.race([p1,p2,p3]).then(data => {
console.log(data);//第一个
});
还可以通过 Promise.resolve()
、Promise.reject()
来使用 Promise
。
Sass是一种基于CSS的预处理语言,在CSS的基础上将代码抽象和简单化。
简单来说就是,Sass可以运用逻辑和变量去写样式,提供很多便利的写法,大大节省设计者的时间,让CSS的开发变得简单,易维护。
SASS写完之后需要编译为css方可使用
安装sass
之前,要先安装Ruby
,安装好Ruby
之后,在命令行输入
gem install sass
就可以使用sass了。
SASS允许使用变量,所有变量以 $
开头。这样就可以设定共同颜色,宽度等等,便于维护。
$red : #f20000;
div{
color:$red;
}
如果变量需要镶嵌在字符串之中,就必须写在#{}之中
$side:left;
.rounded{
border-#{$side}-radius:5px;
}
这篇文章讲述了,如何用webpack + ES6/7 + sass 进行组件化开发,最后生产出兼容的压缩好的 css,js 文件。
下面例子用的是 webpack4.1.0,不同版本的 webpack 可能会稍有不同。
npm init
//当前目录中安装webpack
npm i -D webpack
//当前目录中安装
npm i -D webpack-cli
目录结构如下
|-- dist // 项目编译打包目录
|-- src // 项目源文件
|-- main.js // 程序入口文件,加载各种公共组件
|--common //公共组件文件夹
|--scss //sass组件
main.scss //
|--js //js组件
|-- bar.js // bar组件
|-- static // 静态文件目录
|-- reset.css //css文件
|-- webpack.config.js // webpack配置文件
|-- index.html // 入口html文件
|-- package.json // 项目及工具的依赖配置文件
|-- package-lock // npm版本控制
inex.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>webpack</title>
</head>
<body>
<div id="app">
</div>
<script src="./dist/bundle.js"></script>
</body>
</html>
reset.css
*{
margin: 0;
padding: 0;
}
main.scss
#app div{
font-size: 40px;
color: red;
}
bar.js
export function createDiv(str) {
let div = document.createElement('div');
div.innerHTML = str;
return div;
};
export function add(str1,str2) {
return str1 + str2;
};
main.js
import '../static/css/reset.css';
import './common/js/main.scss';
import { createDiv, add } from './common/js/bar.js';
let sum = add('你好啊, ','webpack');
document.querySelector('#app').appendChild(createDiv(sum));
npm i -D style-loader css-loader
const path = require('path');
module.exports = {
entry: './src/app.js',
output: {
path: path.resolve(__dirname, './dist'),
filename: 'bundle.js'
},
module: {
rules: [
{
// 用正则去匹配要用该 loader 转换的 CSS 文件
test: /\.css$/,
use: [
'style-loader',
'css-loader'
],
}
]
}
};
在scripts中加入了下面这一句,这样就可以用 npm run build
来启动目录下的 webpack 了。development
是指输入开发环境的代码,改为production
则为生产环境的代码,即压缩好的。
"build": "webpack --mode development"
{
"name": "webpack-test",
"version": "1.0.0",
"description": "\"第一个webpack测试\"",
"main": "index.js",
"scripts": {
"build": "webpack --mode development",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "dean",
"license": "ISC",
"devDependencies": {
"css-loader": "^0.28.10",
"extract-text-webpack-plugin": "^3.0.2",
"style-loader": "^0.20.2",
"webpack": "^4.1.0",
"webpack-cli": "^2.0.10"
}
}
npm run build
然后你就会看到在dist文件夹下生成了 bundle.js,在浏览器中打开index.html就可以看到效果了。
安装
npm i -D webpack-dev-server
此时 index.html
中的 script:src 要改为bundle.js。因为这个服务器生成的bundle.js是在内存中的
<script src="bundle.js"></script>
然后在 package.json
文件中的scripts中添加
"start": "webpack-dev-server --watch --mode production",
然后启动
npm run start
然后就可以在 localhost:8080 中看到实时预览了。不过这个功能有点坑爹,有时候的效果会不正确。
前面讲了 webpack 的基本使用,下面再来讲讲常用的 Loader
和 Plugin
。
在一般开发中,我们会想让 webpack 帮我们自动处理一些类似于把 es6
转为 es5
这样的事情,这时候就需要使用loader
和plugin
。
经常要用到的 loader
和plugin
如下 :
首先全局中安装
npm i -g node-sass
接入webpack
## 安装 webpack loader 依赖
npm i -D sass-loader css-loader style-loader
## sass-loader 依赖 node-sass
npm i -D node-sass
npm i -D postcss-loader
## postcss支持下一代css
## autoprefixer自动补全前缀
npm i -D postcss-cssnext
npm i -D autoprefixer
这个装完还需要在首目录创建一个文件postcss.config.js
module.exports = {
plugins: [
require('autoprefixer')({
browsers: ['last 10 Chrome versions', 'last 5 Firefox versions', 'Safari >= 6', 'ie > 8']
}),
require('postcss-cssnext')
]
};
平常写 es6
的时候都要用babel转为 es5
。webpack 也可以帮你完成。
npm i -D babel-plugin-transform-runtime
# Webpack 接入 Babel 必须依赖的模块
npm i -D babel-core babel-loader
# 根据你的需求选择不同的 Plugins 或 Presets
npm i -D babel-preset-env
在目录首页创建 .babelrc
文件,内容大致如下,env
表示包含最新版本的所有新特性,更多参数见官方文档
{
"presets": [
["env", { "modules": false }]
],
"plugins": ["transform-runtime"],
"comments": false
}
当要在sass里加载图片时,就需要使用 url-loader 和 file-loader。
url-loader是对file-loader的上层封装。设置limit,这样体积小于limit的图片将直接以base64的形式内联在代码中,可以减少一次http请求。
npm i -D url-loader
npm i -D file-loader
配置webpack.config.js
{
test:/\.(png)|(jpg)$/,
use: ['url-loader?limit=8192&name=img/[name].[ext]']
}
有时我们需要在打包的时候把css文件单独抽离出来,这时候就需要用到 extract-text-webpack-plugin
。
暂时来说我找不到什么办法可以让 webpack4.1.0
使用这个插件,所以我先把webpack降回到3.1.0版本。
这时 package.json 文件中的 stripts 中的 mode=production 要删去,因为这是webpack4的写法。
npm i -D webpack@3.1.0
npm i -D extract-text-webpack-plugin
然后配置webpack.config.js
const ExtractTextPlugin = require('extract-text-webpack-plugin');
module: {
rules: [
{
// 用正则去匹配要用该 loader 转换的 CSS 文件
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback:'style-loader',
use:[{'css-loader?minimize&?sourceMap'},'postcss-loader?sourceMap' ]
}),
},
]
},
plugins:[
new ExtractTextPlugin('css/main.css')
]
这样就可以把css文件在打包的时候单独抽离出来了,再在html文件中link这个文件即可。
minimize
是打包的时候 把css 文件压缩。
sourceMap
是生成转换地图,方便调试。
有时候我们会反复打包多次,在 dist
文件夹下就可能会有多余文件,所以就需要用到这个插件,在每次打包之前先清空 dist
文件夹。或清除指定格式的文件。
npm i -D clean-webpack-plugin