目录
5.配置 html-webpack-plugin 生成预览页面
1.1 基于 交互式命令行,创建新版 vue项目: vue create my-project
1.2 基于 图形化界面 的方式,创建新版vue项目:vue ui
1.3 基于 2.x 的旧模板,创建旧版vue项目: vue init webpack my-project
一.模块化相关规范
1.模块化概念介绍
- 传统开发模式主要问题:命名冲突、文件依赖
- 模块化:把单独功能封装在一个模块中,模块间相互隔离,通过特定接口公开内部成员,也可以依赖别的模块
- 浏览器端模块化规范:AMD(require.js)、CMD(sea.js)
- 服务器端模块化规范:CommonJS:
- 模块分为:单文件模块 / 包
- 模块成员导出:module.exports 和 exports
- 模块成员导入:require('模块标识符')
- AMD、CMD、CommonJS 并不是 浏览器服务器 通用模块化标准
- ES6模块化规范 是通用标准:
- 每个 js 文件都是独立模块
模块成员导入: import 关键字 模块成员导出: export 关键字2.Node.js babel 体验 ES6模块化
- babel 第三方模块:将 ES6代码 转为 ES5代码
- 转码前:input.map(item => item + 1);
- 转码后:input.map(function (item) { return item + 1;})
npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node npm install --save @babel/polyfill 项目跟目录创建文件 babel.config.js npx babel-node index.js 执行入口文件(npx:高级npm 自带的)
- 关于 babel.config.js:babel 运行前,会读取自己的配置文件,根据配置文件信息进行相关语法转换
- presets:语法转换的数组,里面提供了语法转换时,用到的插件
const presets = [ // presets:语法转换的数组,里面提供了语法转换时,用到的插件 [ '@babel/env', // 这个语法插件 在第一步有下载 { targets: { // 目标浏览器 edge: '17', firefox: '60', chrome: '67', safari: '11.1' }}]] module.exports = { presets } // 导出{presets} 给 babel使用
2.1 默认导出、默认导入(仅可使用一次)
- 默认导出语法 export default 默认导出的成员:export default {a,c,show}
- 默认导入语法 import 接收名称 from '模块标识符':import m1 from './m1.js'
2.2 按需导出、按需导入(可使用多次)
- 按需导出语法 export let s1 = 10:export let s2 = 'ccc' / export function say = function() {}
- 按需导入语法 import { s1 } from '模块标识符':import { s1, s2 as ss2, say } from './m1.js'
- 关于 as:给导出成员进行重命名
结合使用默认及按需: import m1, { s1, s2 as ss2, say } from './m1.js'
2.3 直接导入并执行模块代码
- 某个文件 只有单纯的 js代码,没有任何成员导出,也可以直接将此文件导入入口文件,进行执行
二.webpack
- 当前 Web 开发面临困境:文件依赖关系复杂、静态资源请求效率低、模块化支持度不友好、浏览器对高级JS支持度低
- webpack:一种前端项目构建(打包)工具,提供模块化支持、代码压缩混淆、处理JS兼容、性能优化等
1.webpack 的基本使用
- 新建项目空白目录,运行 npm init –y 命令,初始化包管理配置文件 package.json
- 新建 src 源代码目录,新建 src -> index.html 首页,初始化首页基本的结构
- 运行 npm install jquery –S 命令,安装 jQuery (高级语法,浏览器不支持,需要 webpack解析)
- 通过模块化的形式,index.js 输出文件,index.html 引入前面的文件
- index.js 中使用了高级ES6语法,浏览器不解析,会报错
- webpack 打包处理 index.js 生成新的名为 main.js文件(默认名字),不存在兼容性问题
- 最终把 main.js 引入 index.html
2.安装和配置 webpack
- npm install webpack webpack-cli –D 命令:安装 webpack 相关的包
- 在项目根目录中,创建名为 webpack.config.js 的 webpack 配置文件
- 在 webpack 的配置文件中,初始化:module.exports = { mode: 'development' }
- mode:指定构建模式:development(开发阶段) production(项目发布阶段,代码会压缩)
- package.json 配置文件中的 scripts 节点下,新增 dev,script 节点下的脚本,可以通过 npm run 执行
- "scripts": {"dev": "webpack" } // npm run dev
- 运行 npm run dev 命令,启动 webpack 进行项目打包
3.配置打包的入口与出口
- 打包的 入口文件 为:src -> index.js
- 打包的 输出文件 为:dist -> main.js
- 修改打包的入口与出口,可以在 webpack.config.js 中新增如下配置信息:
- const path = require('path') // 操作路径
- module.exports = { entry: path.join(__dirname, './src/index.js'), // 打包入口文件路径
- output: { path: path.join(__dirname, './dist'), // 打包输出文件路径
filename: 'bundle.js' // 重命名 输出文件的名称(改变默认的 main.js) } 将 src -> index.html 中, script 脚本的引用路径, 修改为 "/buldle.js“ (原来是 main.js)4.配置 webpack 的自动打包功能
- npm install webpack-dev-server –D 命令:安装支持项目自动打包的工具
- 修改 package.json -> scripts 中的 dev 命令:
- "scripts": {"dev": "webpack-dev-server" }
- 运行 npm run dev 命令,重新进行打包
- 在浏览器中访问 http://localhost:8080 地址,查看自动打包效果
- webpack-dev-server 会启动一个实时打包的 http 服务器
- webpack-dev-server 打包生成的输出文件,默认放到根目录中,而且是虚拟的、看不见的
- 即 /buldle.js 作为打包生成的,在根目录下,且不被人看到
5.配置 html-webpack-plugin 生成预览页面
- npm install html-webpack-plugin –D 命令:安装生成预览页面的插件
- 修改 webpack.config.js 文件 头部区域,添加如下配置信息:
- const HtmlWebpackPlugin = require('html-webpack-plugin') // 导入生成预览页面的插件,得到 构造函数
- const htmlPlugin = new HtmlWebpackPlugin({ // 创建插件的实例对象
- template: './src/index.html', // 指定要用到的模板文件
- filename: 'index.html' // 指定生成的文件的名称,该文件存在于内存中,在目录中不显示
- 修改 webpack.config.js 文件中向外暴露的配置对象:
- module.exports = { plugins: [ htmlPlugin ] } // plugins 数组是 webpack 打包期间的插件列表
6.配置自动打包相关参数
- package.json 中配置自动打包:
- "scripts": { "dev": "webpack-dev-server --open --host 127.0.0.1 --port 8888" },
- --open 打包完成后自动打开浏览器页面
- --host 配置 IP 地址
- --port 配置端口
7.webpack 中的加载器
- webpack 默认只能打包 js模块,其他文件调用 loader 加载器 才可以打包,否则报错
- loader 加载器 可以协助 webpack 打包处理特定的文件模块:
- less-loader 可以打包处理 .less 相关的文件
sass-loader 可以打包处理 .scss 相关的文件 url-loader 可以打包处理 css 中与 url 路径相关的文件
- loader 调用过程:判断打包模块是否是 JS模块
- 如果是JS模块,检查是否包含高级JS,包含高级JS就用 babel协助打包,不包含就 webpack打包
- 如果不是JS模块,检查是否配置了对应的 loader,有就 loade 处理,没有就报错
7.1 打包处理 css 文件
- npm i style-loader css-loader -D 命令:安装处理 css 文件的 loader
- 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:
- { test: /\.css$/, use: ['style-loader', 'css-loader'] }
- test :匹配的文件类型, use :对应要调用的 loader
- use 数组中指定的 loader 顺序是固定的,多个 loader 的调用顺序是:从后往前调用
- 配置 postCSS 自动添加 css 的兼容前缀:
- npm i postcss-loader autoprefixer -D 命令
在项目根目录中创建 postcss 的配置文件 postcss.config.js const autoprefixer = require('autoprefixer') // 导入 自动添加前缀的插件 module.exports = { plugins: [ autoprefixer ] } // 挂载插件 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下: { test :/ \.css$ /, use : ['style-loader', 'css-loader', ' postcss-loader '] }7.2 打包处理 less 文件
- npm i less-loader less -D 命令
- 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:
- { test: /\.less$/, use: ['style-loader', 'css-loader', 'less-loader'] }
7.3 打包处理 scss 文件
- npm i sass-loader node-sass -D 命令
- 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:
- { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'] }
- 注意这里是 scss 文件,但是对应的 loader 写法是 sass
7.4 打包样式表中的图片和字体文件
- npm i url-loader file-loader -D 命令
- 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:
{ test : /\.jpg|png|gif|bmp|ttf|eot|svg|woff|woff2$/, use : ' url-loader ?limit=16940' } ? 之后的是 loader 的 参数项 limit 用来指定图片的大小,单位是字节 (byte), 只有小于 limit 大小的图片,才会被转为 base64 图片7.5 打包处理 js 文件中的高级语法
- 安装 babel转换器 相关的包:npm i babel-loader @babel/core @babel/runtime -D
- 安装 babel语法插件 相关的包:npm i @babel/preset-env @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties –D
- 在项目根目录中,创建 babel 配置文件 babel.config.js 并初始化:
module.exports = { presets: [ '@babel/preset-env' ], plugins: [ '@babel/plugin-transform-runtime', '@babel/plugin-proposalclass-properties’ ]}
- 在 webpack.config.js 的 module -> rules 数组中,添加 loader 规则如下:
- { test: /\.js$/, use: 'babel-loader', exclude: /node_modules/ }
- exclude 为排除项,表示 babel-loader 不需要处理 node_modules 中的 js 文件
三.Vue 单文件组件
1.单文本组件构成
- 传统组件的问题:
- 全局定义的组件必须保证 组件名不重复
- 字符串模板缺乏语法高亮,在 HTML 有多行的时候,需要用到丑陋的 \
- 当 HTML/JS 被组件化时,CSS 被排除
- 解决方案:使用 Vue 单文件组件
- 单文件组件的组成结构:
- template 组件的模板区域
- script 业务逻辑区域
- style 样式区域
<template> <!-- 这里用于定义Vue组件的模板内容 --> </template> <script> // 这里用于定义Vue组件的业务逻辑 export default { data: () { return {} }, // 私有数据 methods: {} // 处理函数 // ... 其它业务逻辑 } </script> <style scoped> /* 这里用于定义组件的样式 */ </style>
2.webpack 中配置 vue 组件的加载器
- npm i vue-loader vue-template-compiler -D 命令
- 在 webpack.config.js 配置文件中,添加 vue-loader 的配置项如下:
const VueLoaderPlugin = require('vue-loader/lib/plugin') // 声明插件 { test: /\.vue$/, loader: 'vue-loader' } plugins: [ // ... 其它插件 new VueLoaderPlugin() ] // 请确保引入这个插件!3.在 webpack 项目中使用 vue
- npm i vue –S 安装 vue
- 新建 components文件夹,新建APP.vue
- 在 src -> index.js 入口文件中:
- import Vue from 'vue' // 导入 vue构造函数
- import App from './components/App.vue' // 导入 APP根组件
- const vm = new Vue({ el: '#app',render: h => h(App)}) // 创建 vue 的实例对象,并指定要控制的 el 区域
- 通过 render函数 渲染 App根组件
- 因为在 wabpack里面使用 vue 是不支持很多语法的,比如 component 等等,所以用 render()渲染
4.webpack 打包发布
- 上线之前通过 webpack 将应用进行整体打包,通过 package.json 文件配置打包命令:
- 该命令默认加载项目根目录中的 webpack.config.js 配置文件
"scripts": { // 用于打包的命令 "build": "webpack -p", // 用于开发调试的命令 "dev": "webpack-dev-server --open --host 127.0.0.1 --port 3000", },
- webpack 打包目录结构:
四.Vue 脚手架
1.Vue 脚手架的基本用法
- Vue 脚手架:快速生成 Vue 项目基础架构
- 安装 3.x 版本的 Vue 脚手架: npm install -g @vue/cli
- 查看版本号:vue -v
1.1 基于 交互式命令行,创建新版 vue项目: vue create my-project
- 项目名称不可以有大写字母:// Warning: name can no longer contain capital letters
- Vue CLI v4.4.4(上下箭头操控选项)
? Please pick a preset:
default (babel, eslint) // 默认方式创建
> Manually select features // 手动方式创建(推荐)- Vue CLI v4.4.4(上下箭头操控选项,空格代表选中选项)
? Please pick a preset: Manually select features
? Check the features needed for your project:
(*) Babel
( ) TypeScript
( ) Progressive Web App (PWA) Support
>(*) Router
( ) Vuex
( ) CSS Pre-processors
(*) Linter / Formatter
( ) Unit Testing
( ) E2E Testing- Vue CLI v4.4.4
? Please pick a preset: Manually select features
? Check the features needed for your project: Babel, Router, Linter
? Use history mode for router? (Requires proper server setup for index fallback in production) (Y/n) // 是否安装历史模式的路由,一般选择n- $ cd myproject // 到项目根目录下
$ npm run serve // 把项目运行起来- $ npm run serve // 把项目运行起来
- $ npm run serve // 把项目运行起来
App running at:
- Local: http://localhost:8080/ // 去浏览器中打开这个网址,就是项目了
- Network: http://10.195.149.241:8080/Note that the development build is not optimized.
To create a production build, run npm run build.1.2 基于 图形化界面 的方式,创建新版vue项目:vue ui
1.3 基于 2.x 的旧模板,创建旧版vue项目: vue init webpack my-project
- npm install -g @vue/cli-init ,旧模板必须下载左边的东西
2.Vue 脚手架自定义配置
- 在项目的根目录下,创建配置文件:vue.config.js
module.exports = { devServer: { open: true, // 自动打开浏览器 port: 8888 // 更改端口号 }}
- package.json 主要用来管理包的配置信息,但是也可以配置 vue脚手架相关信息(非常不推荐)
"vue": { // 在 package.json 最底部添加,记得, "devServer": { // 打包期间服务器设置 "port": "8888", // 端口号 "open" : true // 打包成功后自动启动浏览器 }}
五.Element-UI 的基本使用
- Element-UI:基于 Vue2.0的 桌面端组件库
1. 基于命令行方式手动安装
- 安装依赖包:npm i element-ui –S
- 导入 Element-UI 相关资源(导入入口文件 main.js):
- import ElementUI from 'element-ui'; // 导入组件库
- import 'element-ui/lib/theme-chalk/index.css'; // 导入组件相关样式
- Vue.use(ElementUI); // 配置 Vue 插件
- 回到 App.vue 文件中,粘贴自己需要的组件
2. 基于图形化界面自动安装
- 运行 vue ui 命令,打开图形化界面
- 通过 Vue 项目管理器,进入具体的项目配置面板
- 点击 插件 -> 添加插件,进入插件查询面板
- 搜索 vue-cli-plugin-element 并安装
- 配置插件,按需导入,从而减少打包后项目的体积
- 在 vscode中打开项目,回到 App.vue 文件中,粘贴自己需要的组件