diff --git a/part2/fed-e-task-02-02/README.md b/part2/fed-e-task-02-02/README.md index 8b232a64791367e1db50008a2585f9837e89f4a8..a8b3d9ade324eaae4d9034b4c1996a4bc00e3cdd 100644 --- a/part2/fed-e-task-02-02/README.md +++ b/part2/fed-e-task-02-02/README.md @@ -1,58 +1,136 @@ -# 一、简答题 +1.简述前端兼容性的解决方案及不同工具的使用(CSS及JS) -#### 1、Webpack 的构建流程主要有哪些环节?如果可以请尽可能详尽的描述 Webpack 打包的整个过程。 +关键词: post-css | postcss loder | babel | babel-loader | browserslist.rc -  + 对于css 和 js的前端兼容性问题, 主要通过browserslist.rc 文件 结合 post-css 工具 / babel 工具的使用 来实现对不同平台的兼容. -  +​ 对于css和js的兼容问题,其解决方案及流程非常的类似, 大致为 -  +​ a. 获取browserslist.rc 文件信息(或其他方法获取)取得其内容, 明确需要兼容的平台。 -#### 2、Loader 和 Plugin 有哪些不同?请描述一下开发 Loader 和 Plugin 的思路。 +​ b. 通过其命令行工具使用该工具(post-css-cli / @babel/cli)在其使用过程中使用相对应的插件 或插件集合 -  +​ (插件 @babel/plugin-transform-block-scoping |集合:@babel/preset-env) -  +​ c. 最终导出兼容的代码 -  + 在webpack中使用这两种工具则可以通过 loader 来实现, 分别为 post-css-loader 和 babel-loader , 其流程于上述工具在单独使用时类似。 -# 二、编程题 +​ a. 读取源文件 -#### 1、使用 Webpack 实现 Vue 项目打包任务 +​ b. 通过配置文件中的 test + use 来判断对文件的loader 使用,并结合browserslist.rc(或在其他配置文件/命令行中的定义)去执行loader, -具体任务及说明: +​ c. 在loader 的options中添加相对应的插件 或集合 -1. 在 code/vue-app-base 中安装、创建、编辑相关文件,进而完成作业。 -2. 这是一个使用 Vue CLI 创建出来的 Vue 项目基础结构 -3. 有所不同的是这里我移除掉了 vue-cli-service(包含 webpack 等工具的黑盒工具) -4. 这里的要求就是直接使用 webpack 以及你所了解的周边工具、Loader、Plugin 还原这个项目的打包任务 -5. 尽可能的使用上所有你了解到的功能和特性 +​ d. 最终导出兼容的代码 +​ e. 备注: babel-loader 和postcss-loader 可以单独通过配置文件设置 +​ f: 兼容平台可以在 .browserslistrc / 配置文件/ 命令行中定义。 其有先后优先级顺序 -**提示:(开始前必看)** -在视频录制后,webpack 版本以迅雷不及掩耳的速度升级到 5,相应 webpack-cli、webpack-dev-server 都有改变。 -项目中使用服务器的配置应该是改为下面这样: +2.列举三种常见的webpack打包优化手段及使用步骤 -```json -// package.json 中部分代码 -"scripts": { - "serve": "webpack serve --config webpack.config.js" -} -``` +webpack 在打包时的优化在开发阶段和发布前的阶段 优化侧重点不同, 在开发阶段,优化的侧重点是速度, 在发布前则注重打包的结果。根据这一点引出一下几个优化方案 a.根据环境进行不同的打包配置 b.代码拆分(文件过大在加载时 影响用户体验 )c. 第三方 CDN 动态插入 d.文件压缩 e. 优化体验-懒加载 + +a. 分环境打包进行打包 + + 原因: 在开发环境和生产环境对于打包的要求不同,侧重点也不同。根据不同的环境提高速度或减小体积. + +1. 明确打包环境: 在命令行中添加环境参数 --env production |--env development +2. 打包配置拆分: config(文件夹) = common.config.js(共用) + prod.config.js(生产) + dev.config.js(开发) +3. 打包命令-明确入口和环境: yarn webpack --config ./conifg/common.config.js --env production +4. 判断环境:在common.config.js中通过参数获取环境配置 module.exports = (env) =>{} 并判断是哪一种环境 +5. 配置合并前处理: 配置代码拆分 | 文件路径处理 +6. 配置文件合并并返回:common.config.js 和 prod.config.js| dev.config.js 进行合并 (使用webpack-merge) +7. 打包根据合并后的配置文件进行打包并输出 + +b. 代码拆分 + +​ 原因: 文件过大,对于文件加载所需要的时间更长,影响用户体验度 + +​ 方式1: 多入口打包, 将代码按照页面加载需要进行分配。 操作如下: + +​ entry: { + +​ main1: "./src/main1.js", + +​ main2:"./src/main2.js" + +​ } + +​ 方式2: 添加依赖处理项目中依赖的包,将其单独打包。操作如下: + +​ entry: { -vue 文件中 使用 style-loader 即可 +​ main1: { import: "./src/main1.js", dependOn:"lodash"} -**其它问题, 可先到 https://www.npmjs.com/ 上搜索查看相应包的最新版本的配置示例, 可以解决大部分问题.** +​ lodash: "lodash" +​ } +​ 方式3: 使用 SplitChunksPlugin 来拆分代码, 操作如下: -#### 作业要求 +​ optimization:{ + splitChunks:{ // 有很多不同的配置 +​ chunks: "all" + } +​ } -本次作业中的编程题要求大家完成相应代码后 +​ 方式4 - 动态导入 : 默认 拆包 + runtime chunks, 便于浏览器长期缓存, 操作如下: + +​ optimization:{ + runtimeChunks: true +​ } + +c. 第三方 CDN 动态插入 / 或者DLL + + 原因:对于第三方的库,其内容不会经常发生变化,且体积较大,在打包过程中耗时较长,且产出的文件较大,对于页面加载不友好。 + + 其操作方式包括两步:1. 添加配置信息,告诉webpack 某第三方不参加打包 2. 在html 文件中动态插入第三方的包, 操作如下: + + externals: { // 不让lodash参与打包 + lodash: '_' // 语法: 不希望被打包的包名:"包对外暴露的全局变量名" + } + + + + + +d. 文件压缩- 样式文件 举例 + +const MiniCssExtractPlugin = require('mini-css-extract-plugin') +const CssMinimizerWebpackPlugin = require('css-minimizer-webpack-plugin') + +module.exports = { + ... + plugins:[ + new MiniCssExtractPlugin({ + filename:'css/[name].[hash:6].css' + }) + ] + ... + module:{ + rules:[ + { + test:/\.css$/i, + use: [MiniCssExtractPlugin.loader, 'css-loader'] + // 开发模式下用的style-loader, 如果分开模式打包, 可以通过函数来判断时开发还是生产模式, 选择相对的loader。 + use:[ + isProduction ? MiniCssExtractPlugin.loader : style-loader, + 'css-loader' + ] + } + ] + }, + optimization:{ + minimizer:[ + new CssMinimizerWebpackPlugin() + ] + } + +} -- 提交一个项目说明文档,要求思路流程清晰。 -- 或者简单录制一个小视频介绍一下实现思路,并演示一下相关功能。 -- 最终将录制的视频或说明文档和代码统一提交至作业仓库。 \ No newline at end of file +e. 懒加载(prefetch:空闲时 | preload:并行),通过魔法注释实现,操作如下: + import( /*webpackPreLoad:true */ './utils')