前端开发如何通过nodejs创建web服务器

今天刚学的如何应用nodejs创建web服务器,对学习资料进行整理归纳下,希望大神们给指点下!

项目整体分类

首页布局

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"/>
    <script type="text/javascript" src="/static/js/jquery-1.11.3.js"></script>
    <script src="/static/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
</head>
<body>
<nav class="navbar navbar-default">
    <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="#">Brand</a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li>
                <li><a href="#">Link</a></li>
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <li><a href="#">Action</a></li>
                        <li><a href="#">Another action</a></li>
                        <li><a href="#">Something else here</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="#">Separated link</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="#">One more separated link</a></li>
                    </ul>
                </li>
            </ul>
            <form class="navbar-form navbar-left">
                <div class="form-group">
                    <input type="text" class="form-control" placeholder="Search">
                </div>
                <button type="submit" class="btn btn-default">Submit</button>
            </form>
            <ul class="nav navbar-nav navbar-right">
                <li><a href="#">Link</a></li>
                <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                        <li><a href="#">Action</a></li>
                        <li><a href="#">Another action</a></li>
                        <li><a href="#">Something else here</a></li>
                        <li role="separator" class="divider"></li>
                        <li><a href="#">Separated link</a></li>
                    </ul>
                </li>
            </ul>
        </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>
</body>
</html>

router下config.js文件配置

const url_util = require("url");
const fs = require("fs-extra");
const path = require("path");
const mime = require("mime");
const router = {
    get(path,cb){
        this.routes.push({
            path,
            method : "get",
            handler : cb
        })
    },
    handler: function (req, res) {
        //改装res使其拥有render方法来渲染整个页面
        this.refitRes(res);
        let url_info = url_util.parse(req.url);
        let pathname = url_info.pathname;
        //判断是否为资源请求,是的话读取对应的文件,然后响应
        if(pathname.startsWith("/static/")){
            this.responseStatic(pathname,res);
        }
        this.routes.forEach(route => {
            if (route.path == pathname) {
                route.handler(req, res);
            }
        })
    },
    responseStatic(pathname,res){//找到对应的文件
        fs.readFile(path.join(__dirname,".." + pathname),(err,content)=>{
            if(err) throw err
            res.writeHead(200,{"Content-type" : mime.getType(pathname)})
            res.end(content)
        })
    },
    refitRes(res){
        res.render = function (html) {
            //找到HTML文件并响应
            fs.readFile(path.join(__dirname, `../static/${html}.html`), (err, content)=> {
                if (err) throw err;
                res.writeHead(200,{"Content-type" : "text/html;charset=utf8"});
                res.end(content);
            })
        }
    }
}
module.exports = router
router下index.js配置

const router = require("./config")
router.get("/",(req,res) =>{
    res.render("index")
})
module.exports = router.handler.bind(router);
config下index.js配置

const config = {
    dev : {
        port : 3000
    },
    pro : {
        port : 80,
        hostname : "www.xxxx.com"
    }
}
module.exports = config;
创建一个nodejs服务器(server.js)

const  http = require("http");
const config = require("./config");
const router = require("./router");
const mode = 'dev';
const server = http.createServer(router);
server.listen(config[mode].port,config[mode].hostname,() =>{
    console.log(`server is listening...`);
});





  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js 本身是用于服务器端编程的,它并不具备前端渲染的能力。但是可以通过一些工具和框架,使 Node.js 可以渲染 Web Components。 其中,最常用的工具是 Puppeteer,它是一个基于 Chrome Headless 的 Node.js 库,可以模拟用户在浏览器中的操作,包括渲染和操作 Web Components。 使用 Puppeteer 可以通过以下步骤实现 Web Components 的渲染: 1. 安装 Puppeteer 库 可以通过 npm 安装 Puppeteer: ``` npm install puppeteer ``` 2. 启动浏览器 使用 Puppeteer 启动一个浏览器实例: ```javascript const puppeteer = require('puppeteer'); const browser = await puppeteer.launch(); const page = await browser.newPage(); ``` 3. 导航到 Web Components 页面 使用 `page.goto` 方法导航到包含 Web Components 的页面: ```javascript await page.goto('http://example.com/my-web-component'); ``` 4. 等待 Web Components 加载完成 使用 `page.waitForSelector` 等待 Web Components 加载完成: ```javascript await page.waitForSelector('my-web-component'); ``` 5. 获取 Web Components 元素 使用 `page.$` 方法获取 Web Components 元素: ```javascript const webComponent = await page.$('my-web-component'); ``` 6. 获取 Web Components 的 Shadow DOM 使用 `elementHandle.contentFrame` 方法获取 Web Components 的 Shadow DOM: ```javascript const shadowRoot = await webComponent.contentFrame(); ``` 7. 操作 Web Components 使用 `shadowRoot.$` 方法获取 Shadow DOM 中的元素,并通过 `elementHandle.type` 等方法进行操作: ```javascript const inputElement = await shadowRoot.$('input'); await inputElement.type('hello world'); ``` 8. 关闭浏览器实例 最后,使用 `browser.close` 方法关闭浏览器实例: ```javascript await browser.close(); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值