先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
有两点需要特别注意:
•中间件是按顺序执行的,因此在配置中间件时顺序非常重要,不能弄错•中间件在执行内部逻辑的时候可以选择将请求传递给下一个中间件,也可以直接返回用户响应
Express 中间件的定义
在 Express 中,中间件就是一个函数:
function someMiddleware(req, res, next) {
// 自定义逻辑
next();
}
三个参数中,req
和 res
就是前面提到的 Request 请求对象和 Response 响应对象;而 next
函数则用来触发下一个中间件的执行。
注意
如果忘记在中间件中调用
next
函数,并且又不直接返回响应时,服务器会直接卡在这个中间件不会继续执行下去哦!
在 Express 使用中间件有两种方式:全局中间件和路由中间件。
全局中间件
通过 app.use
函数就可以注册中间件,并且此中间件会在用户发起任何请求都可能会执行,例如:
app.use(someMiddleware);
路由中间件
通过在路由定义时注册中间件,此中间件只会在用户访问该路由对应的 URI 时执行,例如:
app.get(‘/middleware’, someMiddleware, (req, res) => {
res.send(‘Hello World’);
});
那么用户只有在访问 /middleware
时,定义的 someMiddleware
中间件才会被触发,访问其他路径时不会触发。
编写中间件
接下来我们就开始实现第一个 Express 中间件。功能很简单,就是在终端打印客户端的访问时间、 HTTP 请求方法和 URI,名为 loggingMiddleware
。代码如下:
// …
const app = express();
function loggingMiddleware(req, res, next) {
const time = new Date();
console.log([${time.toLocaleString()}] ${req.method} ${req.url}
);
next();
}
app.use(loggingMiddleware);
app.get(‘/’, (req, res) => {
res.send(‘Hello World’);
});
// …
注意
在中间件中写
console.log
语句是比较糟糕的做法,因为console.log
(包括其他同步的代码)都会阻塞 Node.js 的异步事件循环,降低服务器的吞吐率。在实际生产中,推荐使用第三方优秀的日志中间件,例如 morgan[8]、winston[9] 等等。
运行服务器,然后用浏览器尝试访问各个路径。这里我访问了首页(localhost:3000)和 /hello
(localhost:3000/hello,浏览器应该看到的是 404),可以看到控制台相应的输出:
[11/28/2019, 3:54:05 PM] GET /
[11/28/2019, 3:54:11 PM] GET /hello
这里为了让你初步理解中间件的概念,我们只实现了一个功能很简单的中间件。实际上,中间件不仅可以读取 req
对象上的各个属性,还可以添加新的属性或修改已有的属性(后面的中间件和路由函数都可以获取),能够很方便地实现一些复杂的业务逻辑(例如用户鉴权)。
用模板引擎渲染页面
最后,我们的网站要开始展示一些实际内容了。Express 对当今主流的模板引擎(例如 Pug、Handlebars、EJS 等等)提供了很好的支持,可以做到两行代码接入。
提示
如果你不了解模板引擎,不用担心,这篇教程几乎不需要用到它的高级功能,你只需理解成一个“升级版的 HTML 文档”即可。
这篇教程将使用 Handlebars[10] 作为模板引擎。首先添加 npm 包:
npm install hbs
创建 views 文件夹,用于放置所有的模板。然后在其中创建首页模板 index.hbs,代码如下:
个人简历
我是一只小小的图雀,渴望学习技术,磨炼实战本领。
创建联系页面模板 contact.hbs,代码如下:
联系方式
QQ:1234567
微信:一只图雀
邮箱:mrc@tuture.co
最后便是在 server.js 中配置和使用模板。配置模板的代码非常简单:
// 指定模板存放目录
app.set(‘views’, ‘/path/to/templates’);
// 指定模板引擎为 Handlebars
app.set(‘view engine’, ‘hbs’);
在使用模板时,只需在路由函数中调用 res.render
方法即可:
// 渲染名称为 hello.hbs 的模板
res.render(‘hello’);
修改后的 server.js 代码如下:
// …
const app = express();
app.set(‘views’, ‘views’);
app.set(‘view engine’, ‘hbs’);
// 定义和使用 loggingMiddleware 中间件 …
app.get(‘/’, (req, res) => {
res.render(‘index’);
});
app.get(‘/contact’, (req, res) => {
res.render(‘contact’);
})
// …
注意在上面的代码中,我们添加了 GET /contact
的路由定义。
最后,我们再次运行服务器,访问我们的主页,可以看到:
点击”联系方式“,跳转到相应页面:
添加静态文件服务
通常网站需要提供静态文件服务,例如图片、CSS 文件、JS 文件等等,而 Express 已经自带了静态文件服务中间件 express.static
,使用起来非常方便。
例如,我们添加静态文件中间件如下,并指定静态资源根目录为 public
:
// …
app.use(express.static(‘public’));
app.get(‘/’, (req, res) => {
res.render(‘index’);
});
// …
假设项目的 public 目录里面有这些静态文件:
public
├── css
│ └── style.css
└── img
└── tuture-logo.png
就可以分别通过以下路径访问:
http://localhost:3000/css/style.css
http://localhost:3000/img/tuture-logo.png
样式文件 public/css/style.css 的代码如下(直接复制粘贴即可):
body {
text-align: center;
}
h1 {
color: blue;
}
img {
border: 1px dashed grey;
}
a {
color: blueviolet;
}
图片文件可通过这个 GitHub 上的链接[11]下载,然后下载到 public/img 目录中。当然,你也可以使用自己的图片,记得在模板中替换相应的链接就可以了。
在首页模板 views/index.hbs 中加入 CSS 样式表和图片:
个人简历
![Logo](/img/tuture-logo.png)
我是一只小小的图雀,渴望学习技术,磨炼实战本领。
在联系模板 views/contact.hbs 中加入样式表:
联系方式
QQ:1234567
微信:一只图雀
邮箱:mrc@tuture.co
再次运行服务器,并访问我们的网站。首页如下:
联系我们页面如下:
可以看到样式表和图片都成功加载出来了!
处理 404 和服务器错误
人有悲欢离合,月有阴晴圆缺,服务器也有出错的时候。HTTP 错误一般分为两大类:
•客户端方面的错误(状态码 4xx),例如访问了不存在的页面(404)、权限不够(403)等等•服务器方面的错误(状态码 5xx),例如服务器内部出现错误(500)或网关错误(503)等等
如果你打开服务器,访问一个不存在的路径,例如 localhost:3000/what
,就会出现这样的页面:
很显然,这样的用户体验是很糟糕的。
在这一节中,我们将讲解如何在 Express 框架中处理 404(页面不存在)及 500(服务器内部错误)。在此之前,我们要完善一下 Express 中间件的运作流程,如下图所示:
这张示意图和之前的图有两点重大区别:
•每个路由定义本质上是一个中间件(更准确地说是一个中间件容器,可包含多个中间件),当 URI 匹配成功时直接返回响应,匹配失败时继续执行下一个路由•每个中间件(包括路由)不仅可以调用 next
函数向下传递、直接返回响应,还可以抛出异常
从这张图就可以很清晰地看出怎么实现 404 和服务器错误的处理了:
•对于 404,只需在所有路由之后再加一个中间件,用来接收所有路由均匹配失败的请求•对于错误处理,前面所有中间件抛出异常时都会进入错误处理函数,可以使用 Express 自带的,也可以自定义。
处理 404
在 Express 中,可以通过中间件的方式处理访问不存在的路径:
app.use(‘*’, (req, res) => {
// …
});
*
表示匹配任何路径。将此中间件放在所有路由后面,即可捕获所有访问路径均匹配失败的请求。
处理内部错误
Express 已经自带了错误处理机制,我们先来体验一下。在 server.js 中添加下面这条”坏掉“的路由(模拟现实中出错的情形):
app.get(‘/broken’, (req, res) => {
throw new Error(‘Broken!’);
});
然后开启服务器,访问 localhost:3000/broken
:
危险!
服务器直接返回了出错的调用栈!很明显,向用户返回这样的调用栈不仅体验糟糕,而且大大增加了被攻击的风险。
实际上,Express 的默认错误处理机制可以通过设置 NODE_ENV
来进行切换。我们将其设置为生产环境 production
,再开启服务器。如果你在 Linux、macOS 或 Windows 下的 Git Bash 环境中,可以运行以下命令:
NODE_ENV=production node server.js
如果你在 Windows 下的命令行,运行以下命令:
set NODE_ENV=production
node server.js
这时候访问 localhost:3000/broken
就会直接返回 Internal Server Error(服务器内部错误),不会显示任何错误信息:
体验还是很不好,更理想的情况是能够返回一个友好的自定义页面。这可以通过 Express 的自定义错误处理函数来解决,错误处理函数的形式如下:
function (err, req, res, next) {
// 处理错误逻辑
}
和普通的中间件函数相比,多了第一个参数,也就是 err
异常对象。
实现自定义处理逻辑
通过上面的讲解,实现自定义的 404 和错误处理逻辑也就非常简单了。在 server.js 所有路由的后面添加如下代码:
// 中间件和其他路由 …
app.use(‘*’, (req, res) => {
res.status(404).render(‘404’, { url: req.originalUrl });
});
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).render(‘500’);
});
app.listen(port, () => {
console.log(Server running at http://${hostname}:${port}/
);
});
提示
在编写处理 404 的逻辑时,我们用到了模板引擎中的变量插值功能。具体而言,在
res.render
方法中将需要传给模板的数据作为第二个参数(例如这里的{ url: req.originalUrl }
传入了用户访问的路径),在模板中就可以通过{{ url }}
获取数据了。
404 和 500 的模板代码分别如下:
找不到你要的页面了!
你所访问的路径 {{ url }} 不存在
服务器好像开小差了
过一会儿再试试看吧!See your later~
❤️ 谢谢支持
喜欢的话别忘了 关注、点赞哦~。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
.log(Server running at http://${hostname}:${port}/
);
});
提示
在编写处理 404 的逻辑时,我们用到了模板引擎中的变量插值功能。具体而言,在
res.render
方法中将需要传给模板的数据作为第二个参数(例如这里的{ url: req.originalUrl }
传入了用户访问的路径),在模板中就可以通过{{ url }}
获取数据了。
404 和 500 的模板代码分别如下:
找不到你要的页面了!
你所访问的路径 {{ url }} 不存在
服务器好像开小差了
过一会儿再试试看吧!See your later~
❤️ 谢谢支持
喜欢的话别忘了 关注、点赞哦~。
[外链图片转存中…(img-rCY5Ym1F-1713665283046)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-LQWnQqzW-1713665283046)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!