用打王者荣耀的方式学习 webpack 没有不会的_前端web派克,web开发工具

63 阅读6分钟

常用的JavaScript设计模式

  • 单体模式

  • 工厂模式

  • 例模式

函数

  • 函数的定义

  • 局部变量和全局变量

  • 返回值

  • 匿名函数

  • 自运行函数

  • 闭包

开源分享:docs.qq.com/doc/DSmRnRG… output: { path: path.resolve(__dirname, 'dist'), filename: 'test.bundle.js' } };


 


**进阶使用:**


当配置了多入口文件并且想输出不同chunk时应该对filename使用占位符来保证文件名称的唯一性。


占位符:


* name——使用入口名称
* id——使用内部chunk id
* hash——使用每次构建过程中的唯一hash
* chunkhash——使用基于每个chunk内容的hash
* query——使用文件名?后面的字符串



{ entry: { app: './src/app.js', search: './src/search.js' }, output: { filename: '[name].js', path: __dirname + '/dist' } }


 


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/828deb8497f54eff9578a25083772da6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=puGK8sVTgt5FADsoxuuaPyFw%2BXQ%3D)


 


#### 吸星大法(loader)


**cd:8秒**


**派克可以同化其他英雄的技能,将其转换为自身可用的能量。成功吸取基础属性+200%。**


(webpack本身只能处理js文件。loader可以将其它文件类型转换为webpack能够处理的模块,并对其进行打包或其它操作。它与modules模块配合使用,通过配置module.rules实现。loader相当于其他工具中的task(任务)。)


loader的核心有两个属性:


* test:匹配需要通过loader进行转换的文件
* use: 指定通过哪个loader进行转换


**基础配置:**



const path = require('path');

const config = { output: { filename: 'test.bundle.js' }, module: { rules: [ { test: /.txt$/, use: 'raw-loader' } ] } };

module.exports = config;


 


**进阶配置:**


rules允许你在处理一个文件时配置多个loader,只需要给use传入一个数组包含不同loader对象



module: {     rules: [       {         test: /.css$/,         use: [           { loader: 'style-loader' },           {             loader: 'css-loader',             options: {               modules: true             }           }         ]       }     ]   }


  
 骚操作:可以在import语句使用!将资源中的loader分开,这样可以不配置webpack从而使用一个内联方式进行loader处理,但不推荐这种方式,因为它很难维护。  



import Styles from 'style-loader!css-loader?modules!./styles.css';


 


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/5e2df33d1c44473680562709b844ded9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=j9NtovFAvD7zTbmOF3sIWW68t6A%3D)


 


#### 光荣进化(plugins 插件)


**cd:35秒**


**派克进化loader,通过plugin对5000码范围内的己方英雄进行增幅、强化,并进入霸体状态持续10秒。**


(不同于loader用来解析非js的文件类型,plugin可以用来处理更复杂的任务,包括打包、优化、压缩,最小到重定义环境变量。它是非常强大的,除了插件市场提供的成熟插件,还可以自己进行编写。plugin为loader带来了更多的特性,它存在的目的在于解决loader无法实现的其他事情。


使用插件只需要`require()`它,然后再添加到plugin模块中,通常情况下多数插件是可自定义的,所以想在一个配置文件中使用不同配置功能的插件,必须通过new创建一个新的实例。)


**基础配置:**



const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装 const webpack = require('webpack'); // 用于访问内置插件

const config = { module: { rules: [ { test: /.txt$/, use: 'raw-loader' } ] }, plugins: [ new HtmlWebpackPlugin({template: './src/index.html'}) ] };

module.exports = config;


 


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e45a045aeda3423db7d7472cf52f275b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=Dvq0VdK6Uw3399vZwQ9onTvYCRY%3D)


 


#### 双重人格(mode 模式)


**cd:1.5秒**


**派克切换形态,工作狂模式:移速增加50%,艺术家模式:减速30%同时增加自身韧性50%,免疫控制。**


(通过`mode`配置开发环境(development)和生产环境(production),可以启用相应模式下webpack的内置优化。)



development:启用NamedChunksPlugin和NamedModulesPlugin插件

production:启用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin,  ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin和 UglifyJsPlugin插件。


**配置:**



module.exports = { mode: 'production' // 或development };


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d39ab75d5b4f467db1a609f68c75079a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=Q0tawU0V20lwnEnrcM737MM25XQ%3D)


 


#### 智者光辉(reslove 模块解析)


**cd:60秒**


**派克指定位置进入快速寻路模式,并自动分析最近路线,且无视地形障碍。**


(通过配置resolve来解析文件路径,reslove中可以配置使用专属插件。)


目前支持解析三种文件路径: 绝对路径、相对路径、模块路径


**配置alias别名(最常用)**


创建 import 或 require 的别名可以使模块引入变简单。 例:



alias: { Utilities: path.resolve(__dirname, 'src/utilities/'), Templates: path.resolve(__dirname, 'src/templates/') }


未配置alias

import Utility from '../../utilities/utility';


已配置alias

import Utility from 'Utilities/utility';


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d3ce1e184889466f9e028ea767642000~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=8sT3hSwsZXF76bLjr5EiusBKpe8%3D)


 


#### 百宝箱(module 模块)


**派克拥有可以储存任何物质的空间物,可以分类储存装备。激活后装备栏增加3,自身移速减20%**


(通过配置module处理项目中的不同类型的模块。) **rules匹配规则数组(最常用)** 创建模块时,匹配请求的规则数组。通过规则能够修改模块的创建方式。这些规则能够对模块(module)应用 loader,或者修改解析器(parser)。


 


 



const config = { module: { rules: [ { test: /.css$/, use: 'css-loader' } ] } };


#### 推荐出装


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/079602c8d2ab44edb1773ebcc40c1a5c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=ROb7Ia6jcaoL21eLnWbuB2chGgU%3D)


 


文件处理


* `raw-loader` 加载文件原始内容(utf-8)
* `val-loader` 将代码作为模块执行,并将 exports 转为 JS 代码
* `url-loader` 像 file loader 一样工作,但如果文件小于限制,可以返回 data URL
* `file-loader` 将文件发送到输出文件夹,并返回(相对)URL


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d5ddbca2f26d447484e8c4c3b27e3421~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=nzyq7qPIWdqipvtoHheX1XJXE7M%3D)


 


JSON


* `json-loader` 加载 JSON 文件(默认包含)
* `json5-loader` 加载和转译 JSON 5 文件
* `cson-loader` 加载和转译 CSON 文件


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/645a86adc93742fcb63de3ebb36a77d0~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=%2F2sq94dwTe4YTqEjDztRkGM11Mg%3D)


 


转换编译(Transpiling)


* `script-loader` 在全局上下文中执行一次 JavaScript 文件(如在 script 标签),不需要解析
* `babel-loader` 加载 ES2015+ 代码,然后使用 Babel 转译为 ES5
* `buble-loader` 使用 Bublé 加载 ES2015+ 代码,并且将代码转译为 ES5
* `traceur-loader` 加载 ES2015+ 代码,然后使用 Traceur 转译为 ES5
* `ts-loader` 或 awesome-typescript-loader 像 JavaScript 一样加载 TypeScript 2.0+
* `coffee-loader` 像 JavaScript 一样加载 CoffeeScript


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/4722be70c7cc43eba82fbae318fe055c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=LcvKHvEk3H4viFwyngAbKzKGR1c%3D)


 


模板(Templating)


* `html-loader` 导出 HTML 为字符串,需要引用静态资源
* `pug-loader` 加载 Pug 模板并返回一个函数
* `jade-loader` 加载 Jade 模板并返回一个函数
* `markdown-loader` 将 Markdown 转译为 HTML
* `react-markdown-loader` 使用 markdown-parse parser(解析器) 将 Markdown 编译为 React 组件
* `posthtml-loader` 使用 PostHTML 加载并转换 HTML 文件
* `handlebars-loader` 将 Handlebars 转移为 HTML
* `markup-inline-loader` 将内联的 SVG/MathML 文件转换为 HTML。在应用于图标字体,或将 CSS 动画应用于 SVG 时非常有用。


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/497e390ec0f54b9d84b20ffece01d5bb~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=MK0iOv6OOLtQ5ovcxW9cNoX%2Fi%2BA%3D)


 


样式


* `style-loader` 将模块的导出作为样式添加到 DOM 中
* `css-loader` 解析 CSS 文件后,使用 import 加载,并且返回 CSS 代码
* `less-loader` 加载和转译 LESS 文件
* `sass-loader` 加载和转译 SASS/SCSS 文件
* `postcss-loader` 使用 PostCSS 加载和转译 CSS/SSS 文件
* `stylus-loader` 加载和转译 Stylus 文件


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/97da671d8437419ea77d9fb0ee4596e1~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=tjBHcqgJTDrZKEUxtacl3%2BDi%2Fi0%3D)


 


清理和测试(Linting && Testing)


* `mocha-loader` 使用 mocha 测试(浏览器/NodeJS)
* `eslint-loader` PreLoader,使用 ESLint 清理代码
* `jshint-loader` PreLoader,使用 JSHint 清理代码
* `jscs-loader` PreLoader,使用 JSCS 检查代码样式
* `coverjs-loader` PreLoader,使用 CoverJS 确定测试覆盖率


 


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/82198ce0d99a486db8a063beadac73a8~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=g5orYaM9AHkBCf%2B3UEUEDo6uF8U%3D)


 


框架(Frameworks)


* `vue-loader` 加载和转译 Vue 组件
* `polymer-loader` 使用选择预处理器(preprocessor)处理,并且 require() 类似一等模块(first-class)的 Web 组件
* `angular2-template-loader` 加载和转译 Angular 组件



### 最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『**难的不会,会的不难**』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://docs.qq.com/doc/DSmRnRGxvUkxTREhO)**

**我特地针对初学者整理一套前端学习资料**

![前端路线图](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/dffb836f537f449584921fbf90fcc33f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=Tj76Egzi%2FqptCskpBcCzFxommu0%3D)

![vue.js的36个技巧](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a11246bdc45e4557af0b23b2065d9b9e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771937060&x-signature=7obHzMd9qf8K9azyN2BUCKRzl40%3D)