模块化概述
传统开发模式的主要问题
① 命名冲突
② 文件依赖
模块化就是把单独的一个功能封装到一个模块(文件)中,模块之间相互隔离,但是可以通过特定的接口公开内部成 员,也可以依赖别的模块
模块化开发的好处:方便代码的重用,从而提升开发效率,并且方便后期的维护
浏览器端模块化规范
- AMD
Require.js (http://www.requirejs.cn/) - CMD
Sea.js (https://seajs.github.io/seajs/docs/)
服务器端模块化规范
- CommonJS
① 模块分为 单文件模块 与 包
② 模块成员导出:module.exports 和 exports
③ 模块成员导入:require(‘模块标识符’)
ES6模块化
在 ES6 模块化规范诞生之前,Javascript 社区已经尝试并提出了 AMD、CMD、CommonJS 等模块化规范。
但是,这些社区提出的模块化标准,还是存在一定的差异性与局限性、并不是浏览器与服务器通用的模块化标准,例如:
AMD 和 CMD 适用于浏览器端的 Javascript 模块化
CommonJS 适用于服务器端的 Javascript 模块化
ES6模块化规范中定义:
每个 js 文件都是一个独立的模块
导入模块成员使用 import 关键字
暴露模块成员使用 export 关键字
ES6 模块化的基本语法
默认到处与默认导入
默认导出语法 export default 默认导出的成员
默认导入语法 import 接收名称 from ‘模块标识符’
注意:每个模块中,只允许使用唯一的一次 export default,否则会报错!
按需导出与按需导入
按需导出语法 export let s1 = 10
按需导入语法 import { s1 } from ‘模块标识符’
s2 as ss2 — 设置别名
注意:每个模块中,可以使用多次按需导出
直接导入并执行模块代码
只想单纯执行某个模块中的代码,并不需要得到模块中向外暴露的成员,此时,可以直接导入并执行模块代码。
webpack
当前web开发面临的困境
文件依赖关系错综复杂
静态资源请求效率低
模块化支持不友好
浏览器对高级 Javascript 特性兼容程度较低
webpack是一个流行的前端项目构建工具(打包工具),可以解决目前web开发的困境.
webpack 提供了友好的模块化支持,以及代码压缩混淆、处理 js 兼容问题、性能优化等强大的功能,从而让程序员把 工作的重心放到具体的功能实现上,提高了开发效率和项目的可维护性。
webpack 的基本使用
1.新建项目空白目录,并运行 npm init –y 命令,初始化包管理配置文件 package.json
2. 新建 src 源代码目录
3. 新建 src -> index.html 首页
4. 初始化首页基本的结构
5. 运行 npm install jquery ,安装 jQuery
6. 新建index.js文件,导入jquery,编写代码并实现功能
此时此时项目运行会有错误,因为import $ from “jquery”;这句代码属于ES6的新语法代码,在浏览器中可能会存在兼容性问题
所以我们需要webpack来帮助我们解决这个问题
7. 安装webpack — npm install webpack webpack-cli –D
8. 在项目根目录中新建webpack.config.js的webpack配置文件
module.exports = {
mode:"development"//可以设置为development(开发模式),production(发布模式)
}
补充:mode设置的是项目的编译模式。
如果设置为development则表示项目处于开发阶段,不会进行压缩和混淆,打包速度会快一些
如果设置为production则表示项目处于上线发布阶段,会进行压缩和混淆,打包速度会慢一些
9.在 package.json 配置文件中的 scripts 节点下,新增 dev 脚本如下:
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack"// script 节点下的脚本,可以通过 npm run 执行
},
10.在终端中运行 npm run dev 命令,启动 webpack 进行项目打包
11. 等待webpack打包完毕之后,找到默认的dist路径中生成的main.js文件,将其引入到html页面中
配置打包的入口与出口
webpack 的 4.x 版本中默认约定:
打包的入口文件为 src -> index.js
打包的输出文件为 dist -> main.js
如果要修改打包的入口与出口,可以在 webpack.config.js 中新增如下配置信息:
const path = require('path'); // 导入 node.js 中专门操作路径的模块
module.exports = {
mode: 'development',
entry: path.join(__dirname, 'src/index.js'),// 打包入口文件的路径
output: {
path: path.join(__dirname, 'dist'),// 输出文件的存放路径
filename: 'index.js'// 输出文件的名称
}
}
配置 webpack 的自动打包功能
默认情况下,我们更改入口js文件的代码,需要重新运行命令打包webpack,才能生成新的js文件
每次都要重新执行命令打包,这是一个非常繁琐的事情,自动打包可以解决这样繁琐的操作。
1.安装自动打包功能的包:webpack-dev-server
npm install webpack-dev-server -D
2.修改package.json中的dev指令如下:
“scripts”:{
“dev”:“webpack-dev-server”
}
3.将引入的js文件路径更改为:
4.运行npm run dev,进行打包
注意:
webpack-dev-server 会启动一个实时打包的 http 服务器
webpack-dev-server 打包生成的输出文件,默认放到了项目根目录中,而且是虚拟的、看不见的
配置 html-webpack-plugin 生成预览页面
因为当我们访问默认的 http://localhost:8080/的时候,看到的是一些文件和文件夹,想要查看我们的页面还需要点击文件夹点击文件才能查看,那么我们希望默认就能看到一个页面,而不是看到文件夹或者目录。
- 运行 npm install html-webpack-plugin –D 命令,安装生成预览页面的插件
- 修改 webpack.config.js 文件头部区域,添加如下配置信息
- 修改 webpack.config.js 文件中向外暴露的配置对象,新增如下配置节点
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');// 导入生成预览页面的插件,得到一个构造函数
const htmlPlugin = new HtmlWebpackPlugin({ // 创建插件的实例对象
template: 'src/index.html', // 指定要用到的模板文件
filename: 'index.html' // 指定生成的文件的名称,该文件存在于内存中,在目录中不显示
});
module.exports = {
mode: 'development',
entry: path.join(__dirname, 'src/index.js'),
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js'
},
plugins: [htmlPlugin] // plugins 数组是 webpack 打包期间会用到的一些插件列表
}
配置自动打包相关的参数
webpack中的加载器
在实际开发过程中,webpack 默认只能打包处理以 .js 后缀名结尾的模块,其他非 .js 后缀名结 尾的模块,webpack 默认处理不了,需要调用 loader 加载器才可以正常打包,否则会报错!
loader 加载器可以协助 webpack 打包处理特定的文件模块
loader加载器包含:
1).less-loader
2).sass-loader
3).url-loader:打包处理css中与url路径有关的文件
4).babel-loader:处理高级js语法的加载器
5).postcss-loader
6).css-loader,style-loader
loader的调用过程
打包处理 css 文件
1.运行 npm i style-loader css-loader -D 命令,安装处理 css 文件的 loader
2. 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');// 导入生成预览页面的插件,得到一个构造函数
const htmlPlugin = new HtmlWebpackPlugin({ // 创建插件的实例对象
template: 'src/index.html', // 指定要用到的模板文件
filename: 'index.html' // 指定生成的文件的名称,该文件存在于内存中,在目录中不显示
});
module.exports = {
mode: 'development',
entry: path.join(__dirname, 'src/index.js'),
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js'
},
plugins: [htmlPlugin], // plugins 数组是 webpack 打包期间会用到的一些插件列表
module: {
// 所有第三方文件模块的匹配规则
rules: [
//test 表示匹配的文件类型, use 表示对应要调用的 loader
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
]
}
}
注意:
use 数组中指定的 loader 顺序是固定的
多个 loader 的调用顺序是:从后往前调用
打包处理less文件
1.安装less,less-loader处理less文件,npm install less-loader less -D
2.在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下
module: {
// 所有第三方文件模块的匹配规则
rules: [
//test 表示匹配的文件类型, use 表示对应要调用的 loader
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] }
]
}
打包处理scss文件
1.安装sass-loader,node-sass,npm install sass-loader node-sass -D
2.在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下
module: {
// 所有第三方文件模块的匹配规则
rules: [
//test 表示匹配的文件类型, use 表示对应要调用的 loader
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
]
}
补充:安装sass-loader失败时,大部分情况是因为网络原因,详情参考:
https://segmentfault.com/a/1190000010984731?utm_source=tag-newest
配置 postCSS 自动添加 css 的兼容前缀
1.安装post-css自动添加css的兼容性前缀(-ie-,-webkit-),npm install postcss-loader autoprefixer -D
2.在项目根目录中创建 postcss 的配置文件 postcss.config.js,并初始化如下配置:
const autoprefixer = require('autoprefixer');// 导入自动添加前缀的插件
module.exports = {
plugins: [autoprefixer]// 挂载插件
}
3.修改webpack-config.js中的module -> rules的规则:
module: {
// 所有第三方文件模块的匹配规则
rules: [
//test 表示匹配的文件类型, use 表示对应要调用的 loader
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] },//加上postcss-loader
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
]
}
打包样式表中的图片和字体文件
在样式表css中有时候会设置背景图片和设置字体文件,一样需要loader进行处理
使用url-loader和file-loader来处理打包图片文件以及字体文件
1.安装:npm install url-loader file-loader -D
2.在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下
module: {
// 所有第三方文件模块的匹配规则
rules: [
//test 表示匹配的文件类型, use 表示对应要调用的 loader
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] },
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
{
test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,
use: "url-loader?limit=16940"//其中 ? 之后的是 loader 的参数项。 limit 用来指定图片的大小,单位是字节(byte),只有小于 limit 大小的图片,才会被转为 base64 图片
}
]
}
打包处理 js 文件中的高级语法
打包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 @babel/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 数组中,添加 loader 规则如下
module: {
// 所有第三方文件模块的匹配规则
rules: [
//test 表示匹配的文件类型, use 表示对应要调用的 loader
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] },
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
{
test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/,
use: "url-loader?limit=16940"
},
{
test: /\.js$/,
use: "babel-loader",
//exclude为排除项,意思是不要处理node_modules中的js文件
exclude: /node_modules/
}
]
}
webpack中配置vue组件的加载器
1.安装 ---- npm install vue-loader vue-template-compiler -D
2.在webpack-config.js文件中配置规则如下:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');// 导入生成预览页面的插件,得到一个构造函数
const htmlPlugin = new HtmlWebpackPlugin({ // 创建插件的实例对象
template: 'src/index.html', // 指定要用到的模板文件
filename: 'index.html' // 指定生成的文件的名称,该文件存在于内存中,在目录中不显示
});
const VueLoaderPlugin = require('vue-loader/lib/plugin');
module.exports = {
mode: 'development',
entry: path.join(__dirname, 'src/index.js'),
output: {
path: path.join(__dirname, 'dist'),
filename: 'index.js'
},
plugins: [htmlPlugin, new VueLoaderPlugin()], // plugins 数组是 webpack 打包期间会用到的一些插件列表
module: {
// 所有第三方文件模块的匹配规则
rules: [
//test 表示匹配的文件类型, use 表示对应要调用的 loader
{ test: /\.css$/, use: ['style-loader', 'css-loader', 'postcss-loader'] },
{ test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] },
{ test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] },
{ test: /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/, use: "url-loader?limit=16940" },
{
test: /\.js$/, use: "babel-loader",
//exclude为排除项,意思是不要处理node_modules中的js文件
exclude: /node_modules/
},
{ test: /\.vue$/, loader: 'vue-loader' }
]
}
}
Vue单文件组件
- 全局定义的组件必须保证组件的名称不重复
- 字符串模板缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的 \
- 不支持 CSS 意味着当 HTML 和 JavaScript 组件化时,CSS 明显被遗漏
- 没有构建步骤限制,只能使用 HTML 和 ES5 JavaScript, 而不能使用预处理器(如:Babel)
针对传统组件的问题,Vue 提供了一个解决方案 —— 使用 Vue 单文件组件。
Vue单文件组件的组成结构
- template 组件的模板区域
- script 业务逻辑区域
- style 样式区域
在webpack项目中使用vue
1.安装vue ---- npm install vue
2.在index.js入口文件中,通过import Vue from 'vue’
3.创建Vue实例对象,并指定要控制的el区域,通过 render 函数渲染 App 根组件
import Vue from 'vue'
import App from './components/App.vue'
const vm = new Vue({
el: '#app',
render: h => h(App)
});
webpack打包发布
上线之前需要通过webpack将应用进行整体打包,可以通过 package.json 文件配置打包命令
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server --open --host 127.0.0.1 --port 8888",
"build": "webpack -p" //打包命令
},
Vue脚手架
用于快速生成Vue项目基础架构.
在命令行工具中使用命令安装
安装 ---- npm install -g @vue/cli
Vue 脚手架的基本用法
在命令行工具中执行以下命令:
Vue脚手架生成的项目结构
Vue脚手架的自定义配置
1.通过package.json配置项目
// 必须是符合规范的json语法,属性必须要加双引号
"vue": {
"devServer": {
"port": "8888",
"open" : true
}
},
2.通过单独的配置文件配置项目
① 在项目的根目录创建文件 vue.config.js
② 在该文件中进行相关配置,从而覆盖默认配置
module.exports = {
devServer: {
open: true //b编译完成后自动打开浏览器
}
}
Element-UI 的基本使用
基于命令行方式手动安装
① 安装依赖包 npm i element-ui
② 导入 Element-UI 相关资源
// 导入组件库
import ElementUI from 'element-ui';
// 导入组件相关样式
import 'element-ui/lib/theme-chalk/index.css';
// 配置 Vue 插件
Vue.use(ElementUI);
基于图形化界面自动安装
① 运行 vue ui 命令,打开图形化界面
② 通过 Vue 项目管理器,进入具体的项目配置面板
③ 点击 插件 -> 添加插件,进入插件查询面板
④ 搜索 vue-cli-plugin-element 并安装
⑤ 配置插件,实现按需导入,从而减少打包后项目的体积