先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
app:‘./app.js’
},
output:{
filename:‘bundle.js’
},
module:{
rules:[]
},
plugins:[]
}
return common;
}
当指定了mode为development之后,执行打包的时候,直接输入webpack,此时打包的方式等同于输入了
webpack --mode development
==========================================================================
先说个简单的例子,跨域,尤其是使用Vue的时候,当我们把模版样式写好,需要对接接口的时候,如果直接启动vue项目,那么就会报跨域错误,因为本地调试的域名是loaclhost,与服务器的接口的域名不一致,此时就没有办法正常连调项目;在webpack中就内置了解决这些问题的方法;
也有全局和局部之分,但是通常我们都是在package.json中配置webpack-dev-server,因此通常使用的是局部安装
//在 项目的根路径下
cnpm install webpack-dev-server --save
在webpack.config.js等配置文件中,与entry,output这些同级属性中加入devServer属性,比如
module.exports = env => {
//直接判断是不是生产环境
let production = env === “production”?[]:[]
var common = {
enrty:{
app:‘./app.js’
},
output:{
filename:‘bundle.js’
},
module:{
rules:[]
},
plugins:[],
//在webpack.config.js或其他指定配置文件中配置webpack-dev-server
//webpack-dev-server配置
//固定对象的key为:devServer,值是一个对象
devServer:{
//端口
port:9001,
//默认是true,一般不用管,是开启浏览器上当前页面的状态
inline:true,
//开启遮罩,具体效果就是vue那种错误遮罩
overlay:true,
//路径重定向,假如页面的路径是错误的,如果未开启,会提示路径错误,找不到页面
//重定义了之后,如果路径错误,那么会仅会停留在当前页面,不会跳转
// histroyApiFallback:true,
///路径重定向进一步使用
historyApiFallback:{
//定义路径,值是一个数组,数组的每一个值代表了一个路径规则
rewrites:[
{
//使用正则匹配
from:/^/([-~])/,
//重定向路径
to:function(context){
return ‘./’+context.macth[1]+‘.html’
}
}
]
},
//代理接口
proxy:{
// '/'代表,碰到以 / 开头的地址就进行代理转发
‘/’:{
//转发的目标地址
//这里也就写上了接口的服务器地址,解决跨域不是同源的问题
target:‘’,
changeOrigin:true,
//重写地址,简化路径名
pathRewirte:{
//key:如果路径中有以/comments的路径地址
//value:改写为/api/comments
//这样就可以大大的减少路径名了
‘^/comments’:‘/api/comments’
},
//代理的请求头
headers:{
}
},
//多个就写多个规则对象
‘/smart’:{
}
},
//热更新
hot:true, //开启热更新
hotOnly:true, //仅仅使用热更新,不使用其他
}
}
return common;
}
值的注意的是,热更新hot和extact-text-webpack-plugin这个插件是不相互兼容的,因此需要把extact-text-webpack-plugin这个插件的注册状态中的disable,设置为true,表示禁用插件;
========================================================================
简单的说,source-map为了方便调试,我们需要知道打包后的代码对应于原文件的位置,因为打包后代码都是被压缩过了,如果线上报错了,根本查不到报错的位置,因为所有关联的js最终都会被合并成一个js文件;
source-map不需要安装,直接开启就好了,它也是和entry,output这些同级,值是规定好的,不同的值代表不同的含义
//开启source-map
devtool:‘eval-source-map’,
//webpack-dev-server配置
devServer:{
},
//它是一个数组
plugins:[
]
开发模式
开发模式下最常用的就这几个
-
eval:构建最快,只能定位到打包后的代码。适用度:无需source-map。
-
eval-source-map:构建较快,生产一个dataUrl形式的sourcemap。适用度:需要简单的调试。
-
cheap-eval-source-map:构建快,重新构建慢,定位到转换后的代码。适用度:较为详细的调试。
-
cheap-module-source-map:构建慢,重构快,能定位到原代码。适用度:开发过程中一般用这个。
生产模式
-
source-map:构建和重构都很慢,能定位原始代码。适用度:上线后一般用这个。
-
hidden-source-map:候检和重构都很慢,能定位原始代码,但不追加注释。适用度:一般不使用。
-
nosource-source-map:构建和重构都很慢,不能定位到源码。适用度:一般不使用。
==============================================================
概述
代码分割的目的为了减少加载代码大小和提取公共资源,减少加载次数做的优化;比如,多页面项目中,a页面和b页面都引入了jq,那么正常情况下,jq会被打包2次,这显然是不合理,jq只需要单独提取出来后打包一次就够了,没有必要混入在a,b中被打包两次;
使用到的webpack的核心功能:optimization,关于这个功能,具体可以查看官网核心功能optimization介绍,或者核心功能optimization介绍;
注意,版本差异:webpack3中使用:commonChunksPlugin,而在webpack4中使用optimization下的SplitChunks,下例以webpack4为主
多页面打包
多页面优化的核心概念,就是提取公共依赖,把几个页面中都用到的依赖给打包为一个单独文件,这样a页面在浏览器被加载完之后,打开了b页面,因为b页面也使用到了这个相同的依赖,因此b页面的打开速度会非常快;
因此,多页面应用一般会这么打包:主页面代码+公共依赖+第三方包+webpack运行代码;
//这个插件是一个辅助性的,作用是删除上一次打包的代码,有时候会遇到上次打包的代码没有被删除
const {CleanWebpackPlugin} =require(‘clean-webpack-plugin’)
module.exports = {
mode:‘development’,
entry:{
a:‘./a.js’,
b:‘./b.js’
},
output:{
filename:‘./[name].[hash:4].min.js’
},
module:{
rules:[]
},
optimization:{
//使用webpack4中的splitChunks
splitChunks:{
name:true,
//优化的类型,all代表所有的都进行优化打包
chunks:‘all’,
//设定公共依赖提取最低大小,小于这个值的公共依赖将不会被提取出来,10000=10kb
minSize:10000,
//缓存组,用于设定指定打包
cacheGroups:{
//打包命名为m2
m2:{
//值是一个正则,代表匹配到这个正则名字文件必须单独打包,这里是m2的文件单独打包
test:/m2/
}
}
},
//运行代码单独打包
runtimeChunk:true
},
plugins:[
new CleanWebpackPlugin(),
]
}
单页面打包
与多页面打包不同,单页面不会存在公共依赖的问题,因为只有一个入口,那么单页面打包优化主要就是减少文件体积,因此,需要拆分应用,把需要异步加载的内容改成异步加载;
因此,单页面应用一般会这么打包:主业务代码+异步模块+第三方包+webpack运行代码;
//这个插件是一个辅助性的,作用是删除上一次打包的代码,有时候会遇到上次打包的代码没有被删除
const {CleanWebpackPlugin} =require(‘clean-webpack-plugin’)
module.exports = {
mode:‘development’,
entry:{
a:‘./a.js’,
b:‘./b.js’
},
output:{
filename:‘./[name].[hash:4].min.js’
},
module:{
rules:[]
},
optimization:{
splitChunks:{
name:true,
chunks:‘all’,
//设定公共依赖提取最低大小
minSize:10000,
},
//运行代码单独打包
runtimeChunk:true
},
plugins:[
new CleanWebpackPlugin(),
]
}
这样其实就可以了,和多页面打包反而少了配置,因为webpack在遇到异步加载的部分本来就会单独打一个包,因此不需要单独配置;
体积控制,其实也差不多,就是压缩,提供公共代码,压缩在webpack3和webpack4中使用的方法不一样,在webpack3中,使用的是:optimize.UglifyJsplugin(),在webpack4中,使用的是:optimization.minimize
webpack4示例大致配置如下:
optimization:{
//体积压缩,将minimize属性设置成true
minimize:true,
splitChunks:{
name:true,
chunks:‘all’,
//设定公共依赖提取最低大小
minSize:10000,
//设定强制打包
cacheGroups:{
//打包命名为m2
m2:{
//提取规则,找到名字是m2的文件单独打包
test:/m2/
}
}
},
//运行代码单独打包
runtimeChunk:true
}
或者,如果指定mode为production,那么webpack在打包的时候会自动实行压缩,即使没有设置成true;
这里还有一个小插件,**tree-shaking,**tree-shaking主要的作用是将没有被import导入的方法通通删除,达到减少体积的作用(注意,如果被import了,但是没有被使用,一样不会被删除,它只是监听export了但是没有被import的方法)
同样,在webpack3中,是需要手动去使用的,但是在webpack4中,如果指定的mode是production,也就是生产模式,那么会自动去执行tree-shaking;
====================================================================
图片在项目中是必不可少的,假如不对图片进行处理,而图片又被使用了,那么在执行打包的时候,webpack会报错,会无法打包图片;
css图片处理
图片资源处理需要用到的loader:file-loader,url-loader,img-loader,具体使用如下,当然,这些都是需要通过npm安装的
// {
// test:/.(png|jpg|jpeg|gif)$/,
// use:[
// {
// loader:‘file-loader’,
// options:{
// //默认是一串哈希.后缀名,改成:原文件名.哈希前4位.后缀名
// name:‘[name].[hash:4].[ext]’,
// //给图片一个打包路径,指定后,打包的图片会被存放到assets/img目录下
// outputPath:‘assets/img’,
// //给所有图片资源指定一个路径前缀,下例就是给所有图片资源的路径前面加上assets/img
// publicPath:‘assets/img’
// }
// }
// ]
// },
//url-loader是对file-loader的二次封装,因此,能在file-loader里使用的属性,那么在url-loader里面一样可以使用
{
test:/.(png|jpg|jpeg|gif)$/,
use:[
{
loader:‘url-loader’,
options:{
//默认是一串哈希.后缀名,改成:原文件名.哈希前4位.后缀名
name:‘[name].[hash:4].[ext]’,
//给图片一个打包路径,指定后,打包的图片会被存放到assets/img目录下
outputPath:‘assets/img’,
//给所有图片资源指定一个路径前缀,下例就是给所有图片资源的路径前面加上assets/img
publicPath:‘assets/img’,
//小于5kb的图片转成base64,一般默认设置在5000,也就是5kb
limit:5000
}
},
//img-loader放在url-loader之后,这样可以先执行
{
//img-loader可以理解成一个插槽,本身不对图片进行处理,需要通过img-loader的plugin里使用插件完成
loader:‘img-loader’,
plugins:[
//压缩png格式,如果没有特殊要求,压缩到原体积的一般
require(‘imagemin-pngquant’)({
//控制压缩质量,值越大,质量越好,1-11,体积越大
speed:5
}),
require(‘imagemin-mozjpeg’)({
//值是1-100,值越大质量越好,体积越大,通常值设置80
quality:50
}),
require(‘imagemin-gifsicle’)({
//值1-3,1是默认值
optimizationLevel:1
})
]
}
]
}
JS图片处理
在JS中,如果要使用到图片,必须以import的方式引入,例如
import imgSrc from ‘./xx.jpg’;
let img = new Image();
img.src = imgSrc;
document.getElementById(‘xxx’).appendChild(img)
之后打包,会通过url-loader之类的loader对其进行压缩打包
HTML图片处理
方法一:通过模版字符串的方式将图片引入
方法二:使用html-loader打包
//html-loader
{
test:‘/.html$/’,
user:{
loader:‘html-loader’,
options:{
//配置这个loader对哪个标签进行解析,不再是src,比如是使用了懒加载的data-src
//下例这个是代表对img标签的data-src进行解析
attrs:[“img:data-src”]
}
}
}
====================================================================
loader的本质其实就是一个方法,当执行打包的时候,webpack会所有内容转成字符串并作为参数传入方法内部,方法接收到后对这一串字符串进行处理,然后返回;
//写法如下,这个resource是一个字符串,webpack会以字符串的形式将内容传递过来
module.exports = function(resource){
return resource
}
这里的resource参数就是打包时传入的内容,当接收到这个参数,在方法内部执行一系列的处理,达到最终目的后返回,这样就执行完毕了一个loader;
需求:将js里面的console.log()这个方法全部删除掉;
要使用的话,首先肯定要创建一个loader,那么在目录下创建一个js文件,之后
module.exports = function (resource) {
//定义一个正则,匹配到传入的resource中所有的console.log()字符串
const regexp = /console.log(.*);?/g
//通过replace方法,将匹配到的所有符合正则的内容替换成空字符串
return resource.replace(regexp,‘’);
// return resource;
}
这样就达到了删除所有console.log()的目的;loader写好了就是使用了:在webpack.config.js这个配置文件里面的module的rules里新增一个对象,指定文件类型是针对.js文件,因为只需要遇到js文件的时候才进行处理,html,css之类的不需要处理,使用到的loader是我们自定义的这个loader
module.exports = {
mode:‘development’,
entry:{
app:‘./app.js’
},
output:{
filename:‘./bundle.js’
},
module:{
rules:[
js基础
1)对js的理解?
2)请说出以下代码输出的值?
3)把以下代码,改写成依次输出0-9
4)如何区分数组对象,普通对象,函数对象
5)面向对象、面向过程
6)面向对象的三大基本特性
7)XML和JSON的区别?
8)Web Worker 和webSocket?
9)Javascript垃圾回收方法?
10)new操作符具体干了什么呢?
11)js延迟加载的方式有哪些?
12)WEB应用从服务器主动推送Data到客户端有那些方式?
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
lace(regexp,‘’);
// return resource;
}
这样就达到了删除所有console.log()的目的;loader写好了就是使用了:在webpack.config.js这个配置文件里面的module的rules里新增一个对象,指定文件类型是针对.js文件,因为只需要遇到js文件的时候才进行处理,html,css之类的不需要处理,使用到的loader是我们自定义的这个loader
module.exports = {
mode:‘development’,
entry:{
app:‘./app.js’
},
output:{
filename:‘./bundle.js’
},
module:{
rules:[
js基础
1)对js的理解?
2)请说出以下代码输出的值?
3)把以下代码,改写成依次输出0-9
4)如何区分数组对象,普通对象,函数对象
5)面向对象、面向过程
6)面向对象的三大基本特性
7)XML和JSON的区别?
8)Web Worker 和webSocket?
9)Javascript垃圾回收方法?
10)new操作符具体干了什么呢?
11)js延迟加载的方式有哪些?
12)WEB应用从服务器主动推送Data到客户端有那些方式?
[外链图片转存中…(img-yg6B7gLS-1713419839812)]
[外链图片转存中…(img-UIha0Oy4-1713419839812)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-I770VIV5-1713419839812)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!