Node.js中静态资源的处理

目录

前言

一、准备阶段

 二、案例

案例1

案例2



前言

        在我们刚开始学习Node.js时,我们只会在页面上输出'hellow world'之类的字符串或者给客户端,只能响应一个干巴巴的html骨架。这还远远不够的,我们并没有把相关的CSS,JS这些引用的静态资源连同html一起响应给用户。 要想完成这些,似并不是个很难的问题,但这对于初学者来说却经常会犯“想当然”的错误。因此,接下来我们就通过两个简单的正反案例,来学习怎么将那些外链资源反馈给用户。



一、准备阶段

先展示一下目录结构

                                                                                 图 1

                                                                                图 2

展示一下最终响应的完整页面

        图 3


 二、案例

案例1

我们在app.js文件里创建好服务器:

let http = require('http')
let fs = require('fs')
let server = http.createServer()
server.listen(3000, function () {
    console.log('server is running');
})
server.on('request', function (req, res) {
    let url = req.url
    if(url === '/') {
        fs.readFile('./view/index.html',function(err,data){
            if(err) {
                res.end('404 Not Found')
                return
            }
            res.end(data)
        })
    }
})

                                                                    代 码 1

之后我们通过浏览器输入网址请求页面,结果就会出现这样的情景:

                                                                       图 4

只有index文件html的骨架,没有样式,图片。这些外链资源依然没有同html一起响应给客户端,这是为什么呢? 这里很多新手都犯了一个“想当然”的错误:我们固认为用户请求对了url,服务器就只需要通过readFile方法找到index.html这个文件,并把它读取,响应给用户,就可以了。 这是错误的,因为浏览器收到HTML响应内容之后,就要开始从上到下依次解析,当在解析的过程中,如果发现:link, script, img, iframe, video, audio等带有 scr 或者 link 的href 属性标签的时候,浏览器会自动对服务端发出这些资源的新的请求。

图 5

 我们通过检查Network可以看到,这些响应都失败了,这是因为我们在服务器文件里并没有配置相关的req.url的原因(见代码1)。

案例2

如果是因为我们没有给index.html文件中的外链资源配置相关url,那我们在配置不就好了,但是又遇到了另一个问题:客户端与服务器之间的交互是“一条请求对应一条响应”,一个页面里有如次之多的外部资源(样式,图片,第三方包,js等),难道我们就要一条一条编写请求路径吗? 这显然不可能。为了解决这个问题,我们会将所有可公开的资源放在一个public文件中,我们把整个文件公开,就不需要 一 一 去设置路径了。

我们重新来过吧:

首先是aap.js文件展示

let http = require('http')
let fs = require('fs');
let server = http.createServer()
server.listen(3000,function(){
    console.log('server is running');
})
server.on('request',function(req,res){
    let url = req.url

//响应这个html网页
    if(url === '/') {
        fs.readFile('./view/index.html',function(err,data){
            if(err) {
                res.end('Not Found!')
            } else {
                res.end(data)
            }
        })
//响应html中所有外链资源
    } else if (url.indexOf('/public/') === 0) {
        fs.readFile('.' + url,function(err,data){
            if(err) {
                res.end('404 Not Found')
            } else {
                res.end(data)
            }
        })
    }
})

                                                                代  码 2

响应过程:当用户发出http请求,服务端会响应请求,读取index.html文件并反馈给用户,用户的浏览器在解析index文件时,遇到带有scr和href属性的外链标签(除了<a>标签,因为链接标签时用户自己点击时才触发的请求),又会重新对这些外部资源发出请求。

代码解释:当用户输入‘/’(或者什么都不写),服务端会响应给用户html页面,当用户的浏览器发出“以/public/开头”的资源请求时,服务器会读取与用户输入的url相同的文件路径,注意:读取的路径要加" . ", html文件里的路径前面不加“ . ”  如图:

html文件

图 6

这是因为浏览器解析html文件时,遇到scr,link属性,就会把这两个属性值当作req.url请求,去向服务器请求这些外链资源,因此固然不能在前面加“.”

而app.js中的readFile需要加“.”是因为要读取服务器里的public文件,这里服务器就渲染了页面,而非是浏览器通过html(因为index.html里的scr和link属性值此时已经不是引用文件的路径了,而是浏览器自动向服务器发出的资源请求!)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用 Node.js 来为静态资源(如 HTML、CSSJavaScript 文件)提供服务。可以按照以下步骤进行操作: 1. 创建一个新的 Node.js 项目,并在项目文件夹创建一个名为 `public`(或其他你想要的名称)的文件夹,用于存放静态资源文件。 2. 在你的项目文件夹创建一个名为 `server.js`(或其他你喜欢的名称)的文件,作为你的 Node.js 服务器代码的入口文件。 3. 在 `server.js` 文件引入 Node.js 的核心模块 `http` 和 `fs`(文件系统)模块,以及其他可能需要的模块。 4. 使用 `http` 模块创建一个 HTTP 服务器,并指定对于每个请求的处理逻辑。 5. 在请求处理逻辑,判断请求的 URL 路径是否对应静态资源文件夹的文件。如果是,使用 `fs` 模块读取该文件,并将其作为响应的内容返回给客户端。 6. 如果请求的路径不对应任何静态资源文件,你可以选择返回一个 404 错误页面或其他适当的响应。 7. 在服务器逻辑设置完成后,使用指定的端口号启动服务器。 下面是一个简单示例: ```javascript const http = require('http'); const fs = require('fs'); const path = require('path'); const server = http.createServer((req, res) => { const filePath = path.join(__dirname, 'public', req.url); const fileExtension = path.extname(filePath); if (fileExtension === '.html' || fileExtension === '.css' || fileExtension === '.js') { fs.readFile(filePath, 'utf8', (err, content) => { if (err) { res.writeHead(404); res.end('404 Not Found'); } else { res.writeHead(200, { 'Content-Type': getContentType(fileExtension) }); res.end(content); } }); } else { res.writeHead(404); res.end('404 Not Found'); } }); const port = 3000; server.listen(port, () => { console.log(`Server listening on port ${port}`); }); function getContentType(fileExtension) { switch (fileExtension) { case '.html': return 'text/html'; case '.css': return 'text/css'; case '.js': return 'text/javascript'; default: return 'text/plain'; } } ``` 以上代码示例会在本地启动一个简单的 Node.js 服务器,用于提供静态资源文件。将你的静态资源文件放置在 `public` 文件夹,并使用相应的 URL 路径进行访问。 请注意,这只是一个简单的示例,并没有处理缓存、压缩等更高级的静态资源服务功能。你可以根据需求进行更复杂的配置和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值