模块化
1.能够了解模块化的相关规范
2.了解webpack
3.了解使用Vue单文件组件
4.能够搭建Vue脚手架
5.掌握Element-UI的使用
概述
-
传统开发模式的主要问题
① 命名冲突
② 文件依赖
-
通过模块化解决上述问题
模块化就是把单独的一个功能封装到一个模块(文件)中,模块之间相互隔离,但是可以通过特定的接口公开内部成员,也可以依赖别的模块
-
模块化开发的好处:
方便代码的重用,从而提升开发效率,并且方便后期的维护
模块化的分类
浏览器端的模块化
-
AMD(Asynchronous Module Definition,异步模块定义)
代表产品为:Require.js
-
CMD(Common Module Definition,通用模块定义)
代表产品为:Sea.js
服务器端的模块化
服务器端的模块化规范是使用CommonJS规范:
1).模块分为 单文件模块 与 包
2).模块成员导出:module.exports 和 exports
3).模块成员导入:require('模块标识符')
4).一个文件就是一个模块,都拥有独立的作用域
ES6模块化
ES6模块化规范中定义:
1).每一个js文件都是独立的模块
2).导入模块成员使用import关键字
3).暴露模块成员使用export关键字
小结
推荐使用ES6模块化,因为AMD,CMD局限使用与浏览器端,而CommonJS在服务器端使用。 ES6模块化是浏览器端和服务器端通用的规范.
Node.jS中使用ES6模块化
Node.js通过babel插件将高级的有兼容性的js代码转化为低级的没有兼容性的js代码
安装和使用
A.安装babel
1.)打开终端,输入命令:
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node
2.)安装完毕之后,再次输入命令安装:
npm install --save @babel/polyfill
B.创建babel.config.js
3.)在项目目录中创建babel.config.js文件。
4.)编辑js文件中的代码如下:
const presets = [
["@babel/env",{
targets:{
edge:"17",
firefox:"60",
chrome:"67",
safari:"11.1"
}
}]
]
//暴露
module.exports = { presets }
C.创建index.js文件
5.)在项目目录中创建index.js文件作为入口文件
在index.js中输入需要执行的js代码,例如:
console.log("ok");
D.使用npx执行文件
6.)打开终端,输入命令:npx babel-node ./index.js 执行代码
7.)babel已经配置完成
ES6模块化基本语法
设置默认导入/导出
A.默认导出
export default {
成员A,
成员B,
.......
},如下:
let num = 100;
export default{
num
}
B.默认导入
import 接收名称 from "模块标识符",如下:
import test from "./test.js"
注意:在一个模块中,只允许使用export default向外默认暴露一次成员,千万不要写多个export default。 如果在一个模块中没有向外暴露成员,其他模块引入该模块时将会得到一个空对象
设置按需导入/导出
A.按需导出
export let num = 998;
export let myName = "jack";
export function fn = function(){ console.log("fn") }
B.按需导入
import { num,fn as printFn ,myName } from "./test.js"
//同时导入默认导出的成员以及按需导入的成员
import test,{ num,fn as printFn ,myName } from "./test.js"
# as 是起别名
注意:一个模块中既可以按需导入也可以默认导入,一个模块中既可以按需导出也可以默认导出
直接导入并执行代码
我们只想单纯执行某个模块中的代码,并不需要得到模块中向外暴露的成员,此时,可以直接导入并执行模块代码。
test2.js 并没有导出任何成员,所以导入时不需要from,直接import导出,执行test2中的代码
import "./test2.js";
webpack
概念
webpack是一个流行的前端项目构建工具,可以解决目前web开发的困境。
- 文件依赖关系错综复杂
- 静态资源请求效率低
- 模块化支持不友好
- 浏览器对高级 Javascript 特性兼容程度较低
webpack的优点
- 提供了模块化支持
- 代码压缩混淆
- 解决js兼容问题
- 性能优化等特性
- 提高了开发效率和项目的可维护性
基本使用
A.创建项目目录并初始化
创建项目,并打开项目所在目录的终端,
输入命令:
npm init -y,
初始化包管理配置文件 package.json
B.创建首页及js文件
新建src源代码目录
新建src-> index.html 首页
初始化页面结构:
在页面中摆放一个ul,ul里面放置几个li
在项目目录中创建js文件夹,并在文件夹中创建index.js文件
C.安装jQuery
打开项目目录终端,输入命令:
npm install jQuery -S
D.导入jQuery
打开src->index.js文件,编写代码导入jQuery并实现功能:
import $ from "jquery";
$(function(){
$("li:odd").css("background","cyan");
$("li:even").css("background","pink");
})
注意:此时项目运行会有错误,因为import $ from "jquery";这句代码属于ES6的新语法代码,在浏览器中可能会存在兼容性问题 所以我们需要webpack来帮助我们解决这个问题。
E.安装配置webpack
- 1). 打开项目目录终端,输入命令:
npm install webpack webpack-cli -D
安装webpack相关的包
- 2).然后在项目根目录中,创建一个 webpack.config.js 的webpack配置文件
- 3).在 webpack.config.js 文件中初始化如下webpack配置 :
module.exports = {
mode:"development"//mode用来指定构建模式
//可以设置为development(开发模式),production(发布模式)
}
补充: mode设置的是项目的编译模式。
a. 如果设置为development则表示项目处于开发阶段,不会进行压缩和混淆,打包速度会快一些
b.如果设置为production则表示项目处于上线发布阶段,会进行压缩和混淆,打包速度会慢一些
- 4).修改项目中的package.json文件添加运行脚本dev,如下:
"scripts":{
"dev":"webpack"//scripts节点下的脚本,可以通过 npm run 运行
}
-
6).运行dev命令启动webpack进行项目打包,并在页面中引入项目打包生成的js文件
- 打开项目目录终端,输入命令:
npm run dev->生成dist目录-
等待webpack打包完毕之后,找到默认的dist路径中生成的main.js文件,将其引入到index.html页面中。
<script src="--/dist/main.js"></script>
配置打包的入口/出口
在webpack 4.x中,默认约定:
- 打包入口js文件为 src -> index.js
- 打包的输出文件为 dist -> main.js
修改打包的入口与出口:
可以在 webpack.config.js 中设置入口/出口的js文件,如下:
const path = require("path");//导入nodejs中专门操作路径的模块
module.exports = {
mode:"development",
//设置入口文件路径
entry: path.join(__dirname,"./src/xx.js"),
//设置出口文件
output:{
//设置路径
path:path.join(__dirname,"./dist"),
//设置输出文件名
filename:"res.js"
}
}
配置webpack的自动打包
默认情况下,我们更改入口js文件的代码,需要重新运行命令打包webpack,才能生成出口的js文件 那么每次都要重新执行命令打包,这是一个非常繁琐的事情,那么,自动打包可以解决这样繁琐的操作。
仅限入口js,不包括其他js配置文件的更改webpack.config.js
实现自动打包功能的步骤如下:
A.安装自动打包功能的包:webpack-dev-server
npm install webpack-dev-server -D
B.修改package.json中的dev指令如下:
"scripts":{
"dev":"webpack-dev-server"
}
C.将引入的js文件路径更改为:<script src="/bundle.js"></script>
D.运行npm run dev 进行打包
E.打开网址查看效果:http://localhost:8080
注意:
-
webpack-dev-server 会启动一个实时打包的 http 服务器
-
webpack-dev-server自动打包的输出文件,默认放到了服务器的根目录中,而且是虚拟的,看不见
所以使用时用“/bunder.js”,使用
/
补充: 在自动打包完毕之后,默认打开服务器网页,实现方式就是打开package.json文件,修改dev命令: "dev": "webpack-dev-server --open --host 127.0.0.1 --port 9999"
配置html-webpack-plugin 生成预览页面
使用html-webpack-plugin 可以生成一个预览页面。 因为当我们访问默认的 http://localhost:8080/的时候,看到的是一些文件和文件夹,想要查看我们的页面还需要点击文件夹点击文件才能查看,那么我们希望默认就能看到一个页面,而不是看到文件夹或者目录。 实现默认预览页面功能的步骤如下:
A.安装默认预览功能的包:html-webpack-plugin
npm install html-webpack-plugin -D
B.修改webpack.config.js文件,如下:
//导入包
const HtmlWebpackPlugin = require("html-webpack-plugin");
//创建对象
const htmlPlugin = new HtmlWebpackPlugin({
//设置生成预览页面的模板文件
template:"./src/index.html",
//设置生成的预览页面名称
filename:"index.html"
})
C.继续修改webpack.config.js文件,添加plugins信息:
module.exports = {
......
plugins:[ htmlPlugin ]
}
配置自动打包相关参数
打包完成后自动打开浏览器页面
配置 IP 地址
配置端口
// 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文件,需要调用loader加载器才能打包,否则会报错
loader 加载器可以协助 webpack 打包处理特定的文件模块
loader加载器的种类
- less-loader 可以打包处理 .less 相关的文件
- sass-loader 可以打包处理 .scss 相关的文件
- url-loader 可以打包处理 css 中与 url 路径相关的文件
- babel-loader:打包处理高级js语法的加载器
- postcss-loader :打包处理css兼容性前缀
- css-loader,style-loader:打包处理css文件
注意:指定多个loader时的顺序是固定的,而调用loader的顺序是从后向前进行调用
loader的调用过程

基本使用
更改完配置文件记得停止服务器,重启npm run dev
打包处理CSS文件
安装style-loader,css-loader来处理样式文件
1). 安装包
npm install style-loader css-loader -D
2).配置规则:
更改webpack.config.js的module中的rules数组
module.exports = {
......
plugins:[ htmlPlugin ],
module : {
rules:[
{
//test表示需要匹配的文件类型,支持正则,$是以...结尾的文件
test:/\.css$/,
//use表示该文件类型需要调用的loader
use:['style-loader','css-loader']
#注意:
1.use数组中指定的loader顺序是固定的
2.多个loader的调用顺序是:从后往前调用,先css-loader->style-oader
}
]
}
}
---------------index.js引入----
import './css/1.css'
打包处理less文件
安装less,less-loader处理less文件
1).安装包
npm install less-loader less -D
2).配置规则:
更改webpack.config.js的module中的rules数组
module.exports = {
......
plugins:[ htmlPlugin ],
module : {
rules:[
{
//test设置需要匹配的文件类型,支持正则
test:/\.css$/,
//use表示该文件类型需要调用的loader
use:['style-loader','css-loader']
},
---------------新增一个rules规则-----------
{
test:/\.less$/,
use:['style-loader','css-loader','less-loader']
}
]
}
}
--------------index.js引入----
import './css/1.less'
打包处理scss文件
安装sass-loader,node-sass 注意这里是sass不是scss
1).安装包
npm install sass-loader node-sass -D
2).配置规则:
更改webpack.config.js的module中的rules数组
module.exports = {
......
plugins:[ htmlPlugin ],
module : {
rules:[
{
//test设置需要匹配的文件类型,支持正则
test:/\.css$/,
//use表示该文件类型需要调用的loader
use:['style-loader','css-loader']
},
{
test:/\.less$/,
use:['style-loader','css-loader','less-loader']
},
----------------------配置scss规则---------
{
test:/\.scss$/,
use:['style-loader','css-loader','sass-loader']
}
]
}
}
--------------index.js引入----------------
import './css/1.scss'
安装sass-loader失败时,大部分情况是因为网络原因,详情参考: segmentfault.com/a/119000001…
自动添加css的兼容性前缀(-ie-,-webkit-)
安装post-css自动添加css的兼容性前缀(-ie-,-webkit-)
1).安装包
npm install postcss-loader autoprefixer -D
2).在项目根目录创建并配置postcss.config.js文件
const autoprefixer = require("autoprefixer");
module.exports = {
plugins:[ autoprefixer ]//挂载插件
}
3).配置规则:
更改webpack.config.js->module->rules数组
module.exports = {
......
plugins:[ htmlPlugin ],
module : {
rules:[
{
-----------修改css的loader规则------------
//test设置需要匹配的文件类型,支持正则
test:/\.css$/,
//use表示该文件类型需要调用的loader
use:['style-loader','css-loader','postcss-loader']
},
.......
}
}
打包样式表中的图片以及字体文件
在样式表css中有时候会设置背景图片和设置字体文件,一样需要loader进行处理
使用url-loader和file-loader来处理打包图片文件以及字体文件
1).安装包
npm install url-loader file-loader -D
2).配置规则:
更改webpack.config.js的module中的rules数组
module.exports = {
......
plugins:[ htmlPlugin ],
module : {
rules:[
......
{ test:/\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,
//limit用来设置字节数,只有小于limit值的图片,才会转换为base64图片
use:"url-loader?limit=16940"
}
]
}
}
打包js文件中的高级语法
在编写js的时候,有时候我们会使用高版本的js语法 有可能这些高版本的语法不被兼容,我们需要将之打包为兼容性的js代码
我们需要安装babel系列的包
1).安装babel转换器
npm install babel-loader @babel/core @babel/runtime -D
2).安装babel语法插件包
npm install @babel/preset-env @babel/plugin-transform-runtime @ba bel/plugin-proposal-class-properties -D
3).在项目根目录创建并配置babel.config.js文件
module.exports = {
presets:["@babel/preset-env"],
plugins:[ "@babel/plugin-transform-runtime", "@babel/plugin-proposal-class-properties" ]
}
4).配置规则:
更改webpack.config.js的module中的rules数组
module.exports = {
......
plugins:[ htmlPlugin ],
module : {
rules:[
......
,{
test:/.js$/,
use:"babel-loader",
//exclude为排除项,意思是不要处理node_modules中的js文件
exclude:/node_modules/
}
]
}
}
Vue单文件组件
传统Vue组件
缺陷:
- 全局定义的组件不能重名,
- 字符串模板缺乏语法高亮,
- 不支持css(当html和js组件化时,css没有参与其中)
- 没有构建步骤限制,只能使用H5和ES5,不能使用预处理器(babel)
解决方案
使用Vue单文件组件,每个单文件组件的后缀名都是.vue
Vue单文件组件(★★★)
组成结构
每一个Vue单文件组件都由三部分组成
- template组件组成的模板区域
- script组成的业务逻辑区域
- style样式区域 style 尽量加上scoped 指令避免组件之间样式冲突
示例模板
xxx.vue
<template>
<!-- 这里用于定义Vue组件的模板内容 -->
组件代码区域
</template>
<script>
// 这里用于定义Vue组件的业务逻辑
export default {
data: () { return {} }, // 私有数据
methods: {} // 处理函数
// ... 其它业务逻辑
}
js代码区域
</script>
<style scoped>
/* 这里用于定义组件的样式 */
样式代码区域
</style>
app.vue
<template>
<div>
<h1>这是 App 根组件</h1>
</div>
</template>
<script>
export default {
data() {
return {};
},
methods: {}
};
</script>
<style scoped>
h1 {
color: red;
}
</style>
webpack中loader加载器配置vue组件
安装Vetur插件可以使得.vue文件中的代码高亮
配置.vue文件的加载器
A.安装vue组件的加载器
npm install vue-loader vue-template-compiler -D
B.配置规则:
更改webpack.con fig.js的module中的rules数组
1) const VueLoaderPlugin = require("vue-loader/lib/plugin");
2)const vuePlugin = new VueLoaderPlugin();
module.exports = {
......
plugins:[ htmlPlugin, vuePlugin ],
//或者 可以省略第二步
/*plugins:[ htmlPlugin,
new VueLoaderPlugin()
],*/
module : {
rules:[
...//其他规则
3)添加rules规则
{
test:/.vue$/,
loader:"vue-loader",
}
]
}
}
在webpack项目中使用vue
上一节我们安装处理了vue单文件组件的加载器,想要让vue单文件组件能够使用,我们必须要安装vue
并使用vue来引用vue单文件组件。
A.安装Vue
npm install vue -S
B.在src-> index.js 入口文件中引入vue:
import Vue from 'vue'
记得导入单文件组件:
import App from './components/App.vue'
C.创建Vue实例对象并指定el,最后使用render函数渲染单文件组件
----------------index.js---------
const vm = new Vue({
//指定vm实例想要控制的页面区域
el:"#first",
// 通过render函数,把指定的组件渲染到el区域中
render:h=>h(App)//app.vue文件导入的示例
#今后webpack vue 组件的渲染都使用render函数
})
------index.html文件---------------
<div id="app"></div>
//将来vue组件控制的区域
使用webpack打包发布项目
在项目上线之前,我们需要将整个项目打包并发布。
- 配置package.json
// 在package.json文件中配置 webpack 打包命令
"scripts":{
......
//用于开发调试的命令
"dev":"webpack-dev-server",
//用于打包的命令 该命令默认加载项目根目录中的 webpack.config.js 配置文件
"build":"webpack -p"
}
- 在项目打包之前,可以将dist目录删除,生成全新的dist目录
Vue脚手架cli
Vue脚手架用于快速生成Vue项目基础的架构。
官网
使用步骤
安装
安装3.x版本的Vue脚手架:
npm install -g @vue/cli
cmd(管理员) ->直接输入
创建vue项目
基于3.x版本的脚手架创建Vue项目的三种方式(前两种常用)
-
1.使用交互式命令创建Vue项目
-
命令:
vue create my-proj ect->cmd ->直接输入,或者cd到文件要安装的位置 -
进入交互式面板
- 选择Manually select features(选择特性以创建项目
- 勾选特性可以用空格进行勾选。 router +babel+linter/formatter
- 是否选用历史模式的路由:n
- ESLint选择:ESLint + Standard config
- 何时进行ESLint语法校验:Lint on save
- babel,postcss等配置文件如何放置:In dedicated config files(单独使用文件进行配置)
- 是否保存为模板:
- 使用哪个工具安装包:npm
-
运行项目:
cd vue_xxxxxx npm run serve
-
-
2.基于ui界面创建Vue项目(推荐)
-
命令:
vue uicmd中直接输入 -
在自动打开的创建项目网页中配置项目信息。
-
选择目录
-
项目名
-
填写Git 初始化提交信息
-
第一次用手动
bable +router+linter/formatter+使用配置文件
-
ESLink+standard config
-
link on save
-
是否保存预设,后期可以一键生成
-
-
-
3.基于2.x的旧模板,创建旧版Vue项目(了解)
cmd->
npm install -g @vue/cli-init
vue init webpack my-project
运行项目
npm run sever
Vue脚手架生成的项目结构分析
- node_modules:依赖包目录
- public:静态资源目录
- src:源码目录
- src/assets:资源目录
- src/components:组件目录
- src/views:视图组件目录
- src/App.vue:根组件
- src/main.js:入口js
- src/router.js:路由js
- babel.config.js: babel配置文件
- .eslintrc.js:
Vue脚手架的自定义配置
- 第一种方式:
通过 package.json 进行配置 [不推荐使用]
新增: "vue":{
"devServer":{
"port":"9990",//端口号
"open":true //自动打开浏览器
}
}
- 第二种方式:(★★★推荐)
通过单独的配置文件进行配置,根目录中创建vue.config.js
比较单一,方便维护
module.exports = {
devServer:{
port:8888,
open:true
}
}
---------停止服务 重新编译运行 npm run server----
Element-UI
Element-UI:一套为开发者、设计师、产品经理准备的基于vue 2.0的桌面端组件库
官网
基本使用
1.基于命令行方式手动安装
- 安装依赖包:
npm install element-ui -S
-
导入Element-UI相关资源:
main.js
//导入组件库
import ElementUI from "element-ui";
//导入组件相关样式
import "element-ui/lib/theme-chalk/index.css";
//配置Vue插件
Vue.use(ElementUI)
2.基于图形化界面自动安装
- cmd 运行
vue ui命令,打开图形化界面 - 通过 Vue 项目管理器,配置具体项目
- 点击 插件 -> 添加插件,进入插件查询面板
- 搜索 vue-cli-plugin-element
- import on demand ->zh-CN(默认) -> 安装
- 插件按需导入,可以减少打包后项目的体积
- import on demand ->zh-CN(默认) -> 安装
根据VUE全家桶整理的笔记,如有侵权请告知