[TOC]
# Webpack
## 1. 在网页中会引用哪些常见的静态资源?
* JS
* .js .jsx .coffee .ts(TypeScript 类 C# 语言)
* CSS
* .css .less .sass .scss
* Images
* .jpg .png .gif .bmp .svg
* 字体文件(Fonts)
* .svg .ttf .eot .woff .wof
* 模板文件
* .ejs .jade .vue【这是在webpack中定义组件的方式,推荐这么用】
## 2. 网页中引入的静态资源多了以后有什么问题???
1. 网页加载速度慢, 因为 我们要发起很多的二次请求;
2. 要处理错综复杂的依赖关系
## 3. 如何解决上述两个问题
1. 合并、压缩、精灵图、图片的Base64编码
2. 可以使用之前学过的requireJS、也可以使用webpack可以解决各个包之间的复杂依赖关系;
## 4. 什么是webpack?
webpack 是前端的一个项目构建工具,它是基于 Node.js 开发出来的一个前端工具;
## 5. 如何完美实现上述的2种解决方案
1. 使用Gulp, 是基于 task 任务的;
2. 使用Webpack, 是基于整个项目进行构建的;
* 借助于webpack这个前端自动化构建工具,可以完美实现资源的合并、打包、压缩、混淆等诸多功能。
* 根据官网的图片介绍webpack打包的过程
* [webpack官网](http://webpack.github.io/)
## 6. webpack安装的两种方式
1. 运行`npm i webpack -g`全局安装webpack,这样就能在全局使用webpack的命令
2. 在项目根目录中运行`npm i webpack --save-dev`安装到项目依赖中
## 初步使用webpack打包构建列表隔行变色案例
1. 运行`npm init`初始化项目,使用npm管理项目中的依赖包
2. 创建项目基本的目录结构
3. 使用`cnpm i jquery --save`安装jquery类库
4. 创建`main.js`并书写各行变色的代码逻辑:
~~~
// 导入jquery类库
import $ from 'jquery'
// 设置偶数行背景色,索引从0开始,0是偶数
$('#list li:even').css('backgroundColor','lightblue');
// 设置奇数行背景色
$('#list li:odd').css('backgroundColor','pink');
~~~
5. 直接在页面上引用`main.js`会报错,因为浏览器不认识`import`这种高级的JS语法,需要使用webpack进行处理,webpack默认会把这种高级的语法转换为低级的浏览器能识别的语法;
6. 运行`webpack 入口文件路径 输出文件路径`对`main.js`进行处理:
~~~
webpack src/js/main.js dist/bundle.js
~~~
## 7. 使用webpack的配置文件简化打包时候的命令
1. 在项目根目录中创建`webpack.config.js`
2. 由于运行webpack命令的时候,webpack需要指定入口文件和输出文件的路径,所以,我们需要在`webpack.config.js`中配置这两个路径:
~~~
// 导入处理路径的模块
var path = require('path');
// 导出一个配置对象,将来webpack在启动的时候,会默认来查找webpack.config.js,并读取这个文件中导出的配置对象,来进行打包处理
module.exports = {
entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件
output: { // 配置输出选项
path: path.resolve(__dirname, 'dist'), // 配置输出的路径
filename: 'bundle.js' // 配置输出的文件名
}
}
~~~
## 实现webpack的实时打包构建
1. 由于每次重新修改代码之后,都需要手动运行webpack打包的命令,比较麻烦,所以使用`webpack-dev-server`来实现代码实时打包编译,当修改代码之后,会自动进行打包构建。
2. 运行`cnpm i webpack-dev-server --save-dev`安装到开发依赖
3. 安装完成之后,在命令行直接运行`webpack-dev-server`来进行打包,发现报错,此时需要借助于`package.json`文件中的指令,来进行运行`webpack-dev-server`命令,在`scripts`节点下新增`"dev": "webpack-dev-server"`指令,发现可以进行实时打包,但是dist目录下并没有生成`bundle.js`文件,这是因为`webpack-dev-server`将打包好的文件放在了内存中
* 把`bundle.js`放在内存中的好处是:由于需要实时打包编译,所以放在内存中速度会非常快
* 这个时候访问webpack-dev-server启动的`http://localhost:8080/`网站,发现是一个文件夹的面板,需要点击到src目录下,才能打开我们的index首页,此时引用不到bundle.js文件,需要修改index.html中script的src属性为:`<script src="../bundle.js"></script>`
* 为了能在访问`http://localhost:8080/`的时候直接访问到index首页,可以使用`--contentBase src`指令来修改dev指令,指定启动的根目录:
~~~
"dev": "webpack-dev-server --contentBase src"
~~~
同时修改index页面中script的src属性为`<script src="bundle.js"></script>`
## 使用`html-webpack-plugin`插件配置启动页面
由于使用`--contentBase`指令的过程比较繁琐,需要指定启动的目录,同时还需要修改index.html中script标签的src属性,所以推荐大家使用`html-webpack-plugin`插件配置启动页面.
1. 运行`cnpm i html-webpack-plugin --save-dev`安装到开发依赖
2. 修改`webpack.config.js`配置文件如下:
~~~
// 导入处理路径的模块
var path = require('path');
// 导入自动生成HTMl文件的插件
var htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: path.resolve(__dirname, 'src/js/main.js'), // 项目入口文件
output: { // 配置输出选项
path: path.resolve(__dirname, 'dist'), // 配置输出的路径
filename: 'bundle.js' // 配置输出的文件名
},
plugins:[ // 添加plugins节点配置插件
new htmlWebpackPlugin({
template:path.resolve(__dirname, 'src/index.html'),//模板路径
filename:'index.html'//自动生成的HTML文件的名称
})
]
}
~~~
3. 修改`package.json`中`script`节点中的dev指令如下:
~~~
"dev": "webpack-dev-server"
~~~
4. 将index.html中script标签注释掉,因为`html-webpack-plugin`插件会自动把bundle.js注入到index.html页面中!
## 实现自动打开浏览器、热更新和配置浏览器的默认端口号
**注意:热更新在JS中表现的不明显,可以从一会儿要讲到的CSS身上进行介绍说明!**
### 方式1:
* 修改`package.json`的script节点如下,其中`--open`表示自动打开浏览器,`--port 4321`表示打开的端口号为4321,`--hot`表示启用浏览器热更新:
~~~
"dev": "webpack-dev-server --hot --port 4321 --open"
~~~
### 方式2:
1. 修改`webpack.config.js`文件,新增`devServer`节点如下:
~~~
devServer:{
hot:true,
open:true,
port:4321
}
~~~
2. 在头部引入`webpack`模块:
~~~
var webpack = require('webpack');
~~~
3. 在`plugins`节点下新增:
~~~
new webpack.HotModuleReplacementPlugin()
~~~
## 使用webpack打包css文件
1. 运行`cnpm i style-loader css-loader --save-dev`
2. 修改`webpack.config.js`这个配置文件:
~~~
module: { // 用来配置第三方loader模块的
rules: [ // 文件的匹配规则
{ test: /\.css$/, use: ['style-loader', 'css-loader'] }//处理css文件的规则
]
}
~~~
3. 注意:`use`表示使用哪些模块来处理`test`所匹配到的文件;`use`中相关loader模块的调用顺序是从后向前调用的;
## 使用webpack打包less文件
1. 运行`cnpm i less-loader less -D`
2. 修改`webpack.config.js`这个配置文件:
~~~
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
~~~
## 使用webpack打包sass文件
1. 运行`cnpm i sass-loader node-sass --save-dev`
2. 在`webpack.config.js`中添加处理sass文件的loader模块:
~~~
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
~~~
## 使用webpack处理css中的路径
1. 运行`cnpm i url-loader file-loader --save-dev`
2. 在`webpack.config.js`中添加处理url路径的loader模块:
~~~
{ test: /\.(png|jpg|gif)$/, use: 'url-loader' }
~~~
3. 可以通过`limit`指定进行base64编码的图片大小;只有小于指定字节(byte)的图片才会进行base64编码:
~~~
{ test: /\.(png|jpg|gif)$/, use: 'url-loader?limit=43960' },
~~~
## 使用babel处理高级JS语法
1. 运行`cnpm i babel-core babel-loader babel-plugin-transform-runtime --save-dev`安装babel的相关loader包
2. 运行`cnpm i babel-preset-es2015 babel-preset-stage-0 --save-dev`安装babel转换的语法
3. 在`webpack.config.js`中添加相关loader模块,其中需要注意的是,一定要把`node_modules`文件夹添加到排除项:
~~~
{ test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }
~~~
4. 在项目根目录中添加`.babelrc`文件,并修改这个配置文件如下:
~~~
{
"presets":["es2015", "stage-0"],
"plugins":["transform-runtime"]
}
~~~
5. **注意:语法插件`babel-preset-es2015`可以更新为`babel-preset-env`,它包含了所有的ES相关的语法;**
# Vue.js - day6
## 注意:
有时候使用`npm i node-sass -D`装不上,这时候,就必须使用 `cnpm i node-sass -D`
## 在普通页面中使用render函数渲染组件
## 在webpack中配置.vue组件页面的解析
1. 运行`cnpm i vue -S`将vue安装为运行依赖;
2. 运行`cnpm i vue-loader vue-template-compiler -D`将解析转换vue的包安装为开发依赖;
3. 运行`cnpm i style-loader css-loader -D`将解析转换CSS的包安装为开发依赖,因为.vue文件中会写CSS样式;
4. 在`webpack.config.js`中,添加如下`module`规则:
~~~
module: {
rules: [
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
{ test: /\.vue$/, use: 'vue-loader' }
]
}
~~~
5. 创建`App.js`组件页面:
~~~
<template>
<!-- 注意:在 .vue 的组件中,template 中必须有且只有唯一的根元素进行包裹,一般都用 div 当作唯一的根元素 -->
<div>
<h1>这是APP组件 - {{msg}}</h1>
<h3>我是h3</h3>
</div>
</template>
<script>
// 注意:在 .vue 的组件中,通过 script 标签来定义组件的行为,需要使用 ES6 中提供的 export default 方式,导出一个vue实例对象
export default {
data() {
return {
msg: 'OK'
}
}
}
</script>
<style scoped>
h1 {
color: red;
}
</style>
~~~
6. 创建`main.js`入口文件:
~~~
// 导入 Vue 组件
import Vue from 'vue'
// 导入 App组件
import App from './components/App.vue'
// 创建一个 Vue 实例,使用 render 函数,渲染指定的组件
var vm = new Vue({
el: '#app',
render: c => c(App)
});
~~~
## 在使用webpack构建的Vue项目中使用模板对象?
1. 在`webpack.config.js`中添加`resolve`属性:
~~~
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
}
~~~
## ES6中语法使用总结
1. 使用 `export default` 和 `export` 导出模块中的成员; 对应ES5中的 `module.exports` 和 `export`
2. 使用 `import ** from **` 和 `import '路径'` 还有 `import {a, b} from '模块标识'` 导入其他模块
3. 使用箭头函数:`(a, b)=> { return a-b; }`
## 在vue组件页面中,集成vue-router路由模块
[vue-router官网](https://router.vuejs.org/)
1. 导入路由模块:
~~~
import VueRouter from 'vue-router'
~~~
2. 安装路由模块:
~~~
Vue.use(VueRouter);
~~~
3. 导入需要展示的组件:
~~~
import login from './components/account/login.vue'
import register from './components/account/register.vue'
~~~
4. 创建路由对象:
~~~
var router = new VueRouter({
routes: [
{ path: '/', redirect: '/login' },
{ path: '/login', component: login },
{ path: '/register', component: register }
]
});
~~~
5. 将路由对象,挂载到 Vue 实例上:
~~~
var vm = new Vue({
el: '#app',
// render: c => { return c(App) }
render(c) {
return c(App);
},
router // 将路由对象,挂载到 Vue 实例上
});
~~~
6. 改造App.vue组件,在 template 中,添加`router-link`和`router-view`:
~~~
<router-link to="/login">登录</router-link>
<router-link to="/register">注册</router-link>
<router-view></router-view>
~~~
## 组件中的css作用域问题
## 抽离路由为单独的模块
## 使用 饿了么的 MintUI 组件
[Github 仓储地址](https://github.com/ElemeFE/mint-ui)
[Mint-UI官方文档](http://mint-ui.github.io/#!/zh-cn)
1. 导入所有MintUI组件:
~~~
import MintUI from 'mint-ui'
~~~
2. 导入样式表:
~~~
import 'mint-ui/lib/style.css'
~~~
3. 在 vue 中使用 MintUI:
~~~
Vue.use(MintUI)
~~~
4. 使用的例子:
~~~
<mt-button type="primary" size="large">primary</mt-button>
~~~
## 使用 MUI 组件
[官网首页](http://dev.dcloud.net.cn/mui/)
[文档地址](http://dev.dcloud.net.cn/mui/ui/)
1. 导入 MUI 的样式表:
~~~
import '../lib/mui/css/mui.min.css'
~~~
2. 在`webpack.config.js`中添加新的loader规则:
~~~
{ test: /\.(png|jpg|gif|ttf)$/, use: 'url-loader' }
~~~
3. 根据官方提供的文档和example,尝试使用相关的组件
## 将项目源码托管到oschina中
1. 点击头像 -> 修改资料 -> SSH公钥 [如何生成SSH公钥](http://git.mydoc.io/?t=154712)
2. 创建自己的空仓储,使用 `git config --global user.name "用户名"` 和 `git config --global user.email ***@**.com` 来全局配置提交时用户的名称和邮箱
3. 使用 `git init` 在本地初始化项目
4. 使用 `touch README.md` 和 `touch .gitignore` 来创建项目的说明文件和忽略文件;
5. 使用 `git add .` 将所有文件托管到 git 中
6. 使用 `git commit -m "init project"` 将项目进行本地提交
7. 使用 `git remote add origin 仓储地址`将本地项目和远程仓储连接,并使用origin最为远程仓储的别名
8. 使用 `git push -u origin master` 将本地代码push到仓储中
## App.vue 组件的基本设置
1. 头部的固定导航栏使用 `Mint-UI` 的 `Header` 组件;
2. 底部的页签使用 `mui` 的 `tabbar`;
3. 购物车的图标,使用 `icons-extra` 中的 `mui-icon-extra mui-icon-extra-cart`,同时,应该把其依赖的字体图标文件 `mui-icons-extra.ttf`,复制到 `fonts` 目录下!
4. 将底部的页签,改造成 `router-link` 来实现单页面的切换;
5. Tab Bar 路由激活时候设置高亮的两种方式:
* 全局设置样式如下:
~~~
.router-link-active{
color:#007aff !important;
}
~~~
* 或者在 `new VueRouter` 的时候,通过 `linkActiveClass` 来指定高亮的类:
~~~
// 创建路由对象
var router = new VueRouter({
routes: [
{ path: '/', redirect: '/home' }
],
linkActiveClass: 'mui-active'
});
~~~
## 实现 tabbar 页签不同组件页面的切换
1. 将 tabbar 改造成 `router-link` 形式,并指定每个连接的 `to` 属性;
2. 在入口文件中导入需要展示的组件,并创建路由对象:
~~~
// 导入需要展示的组件
import Home from './components/home/home.vue'
import Member from './components/member/member.vue'
import Shopcar from './components/shopcar/shopcar.vue'
import Search from './components/search/search.vue'
// 创建路由对象
var router = new VueRouter({
routes: [
{ path: '/', redirect: '/home' },
{ path: '/home', component: Home },
{ path: '/member', component: Member },
{ path: '/shopcar', component: Shopcar },
{ path: '/search', component: Search }
],
linkActiveClass: 'mui-active'
});
~~~
## 使用 mt-swipe 轮播图组件
1. 假数据:
~~~
lunbo: [
'http://www.itcast.cn/images/slidead/BEIJING/2017440109442800.jpg',
'http://www.itcast.cn/images/slidead/BEIJING/2017511009514700.jpg',
'http://www.itcast.cn/images/slidead/BEIJING/2017421414422600.jpg'
]
~~~
2. 引入轮播图组件:
~~~
<!-- Mint-UI 轮播图组件 -->
<div class="home-swipe">
<mt-swipe :auto="4000">
<mt-swipe-item v-for="(item, i) in lunbo" :key="i">
<img :src="item" alt="">
</mt-swipe-item>
</mt-swipe>
</div>
</div>
~~~
## 在`.vue`组件中使用`vue-resource`获取数据
1. 运行`cnpm i vue-resource -S`安装模块
2. 导入 vue-resource 组件
~~~
import VueResource from 'vue-resource'
~~~
3. 在vue中使用 vue-resource 组件
- vue
- 为什么要学vue
- 数据双向绑定
- vue指令
- v-bind创建HTML节点属性
- v-on绑定事件
- v-cloak
- v-text
- v-for和key属性
- v-if和v-show
- 案例1
- 自定义指令
- vue样式
- vue生命周期
- vue过滤器
- 自定义键盘修饰符
- 跨域请求
- vue组件
- 组件基础
- 引入vue文件组件
- 引入render函数作为组件
- 兄弟间组件通信
- 组件函数数据传递练习
- 路由
- 数据监听
- webpack
- vue校验
- vue笔记
- form表单中input前部分默认输入,切不可修改
- mixins
- 部署到nginx
- scope
- render
- 下载文件
- vue动态组件
- axios
- Promise
- vue进阶
- node-vue-webpack搭建
- vue事件
- 插槽
- vuex
- vuex基础
- vuex命名空间
- HTML递归?
- this.$nextTick异步更新dom
- elementui
- table
- 修改element ui样式
- form
- 优质博客
- vuex state数据与form元素绑定
- es6
- Promise