zoukankan      html  css  js  c++  java
  • node部署静态页面;node上线静态页面

    node部署静态页面上线

    静态页面上线可以采用 nginx, tomcat或者node ,我们这里介绍下node部署静态页面

    这里采用最简单的上线方式,我们就不用node + express + ejs ,直接采用node + html

    1.首先确定好安装了 node 如果没有安装,请下载 https://nodejs.org/zh-cn/ 建议下载LTS版本

    2.新建一个目录,比如 test 文件夹,然后在当前文件夹下进入命令行窗口 npm init 初始化npm,此处一路回车,这时会生成 package.json的一个文件

    3.然后我们需要在 test 的根目录下创建一个 server.js

    • server.js
    "use strict";
    //加载所需要的模块
    var http = require('http');
    var url = require('url');
    var fs = require('fs');
    var path = require('path');
    var cp = require('child_process');
    
    //创建服务
    var httpServer = http.createServer(processRequest);
    // 这是端口号
    var port = 80;
    
    //指定一个监听的接口
    httpServer.listen(port, function() {
        console.log(`app is running at port:${port}`);
        console.log(`url: http://localhost:${port}`);
        cp.exec(`explorer http://localhost:${port}`, function () {
        });
    });
    
    //响应请求的函数
    function processRequest (request, response) {
        //mime类型
        var mime = {
            "css": "text/css",
            "gif": "image/gif",
            "html": "text/html",
            "ico": "image/x-icon",
            "jpeg": "image/jpeg",
            "jpg": "image/jpeg",
            "js": "text/javascript",
            "json": "application/json",
            "pdf": "application/pdf",
            "png": "image/png",
            "svg": "image/svg+xml",
            "swf": "application/x-shockwave-flash",
            "tiff": "image/tiff",
            "txt": "text/plain",
            "wav": "audio/x-wav",
            "wma": "audio/x-ms-wma",
            "wmv": "video/x-ms-wmv",
            "xml": "text/xml"
        };
        
        //request里面切出标识符字符串
        var requestUrl = request.url;
        //url模块的parse方法 接受一个字符串,返回一个url对象,切出来路径
        var pathName = url.parse(requestUrl).pathname;
    
        //对路径解码,防止中文乱码
        var pathName = decodeURI(pathName);
    
        //解决301重定向问题,如果pathname没以/结尾,并且没有扩展名
        if (!pathName.endsWith('/') && path.extname(pathName) === '') {
            pathName += '/';
            var redirect = "http://" + request.headers.host + pathName;
            response.writeHead(301, {
                location: redirect
            });
            //response.end方法用来回应完成后关闭本次对话,也可以写入HTTP回应的具体内容。
            response.end();
        }
    
        //获取资源文件的绝对路径
        var filePath = path.resolve(__dirname + pathName);
        console.log(filePath);
        //获取对应文件的文档类型
        //我们通过path.extname来获取文件的后缀名。由于extname返回值包含”.”,所以通过slice方法来剔除掉”.”,
        //对于没有后缀名的文件,我们一律认为是unknown。
        var ext = path.extname(pathName);
        ext = ext ? ext.slice(1) : 'unknown';
    
        //未知的类型一律用"text/plain"类型
        var contentType = mime[ext] || "text/plain";
    
        fs.stat(filePath, (err, stats) => {
            if (err) {
                response.writeHead(404, { "content-type": "text/html" });
                response.end("<h1>404 Not Found</h1>");
            }
            //没出错 并且文件存在
            if (!err && stats.isFile()) {
                readFile(filePath, contentType);
            }
            //如果路径是目录
            if (!err && stats.isDirectory()) {
                var html = "<head><meta charset = 'utf-8'/></head><body><ul>";
                //读取该路径下文件
                fs.readdir(filePath, (err, files) => {
                    if (err) {
                        console.log("读取路径失败!");
                    } else {
                        //做成一个链接表,方便用户访问
                        var flag = false;
                        for (var file of files) {
                            //如果在目录下找到index.html,直接读取这个文件
                            if (file === "index.html") {
                                readFile(filePath + (filePath[filePath.length-1]=='/' ? '' : '/') + 'index.html', "text/html");
                                flag = true;
                                break;
                            };
                            html += `<li><a href='${file}'>${file}</a></li>`;
                        }
                        if(!flag) {
                            html += '</ul></body>';
                            response.writeHead(200, { "content-type": "text/html" });
                            response.end(html);
                        }
                    }
                });
            }
    
            //读取文件的函数
            function readFile(filePath, contentType){
                response.writeHead(200, { "content-type": contentType });
                //建立流对象,读文件
                var stream = fs.createReadStream(filePath);
                //错误处理
                stream.on('error', function() {
                    response.writeHead(500, { "content-type": contentType });
                    response.end("<h1>500 Server Error</h1>");
                });
                //读取文件
                stream.pipe(response);
            }
        });
    }
    

    4.这是运行node server.js 便启动了服务,我们可以通过本地 localhost 进行访问,也可上传到linux,通过自己域名访问

  • 相关阅读:
    UVA 10572 Black & White (状压DP)
    ZOJ 3466 The Hive II (插头DP,变形)
    POJ 3133 Manhattan Wiring (插头DP,轮廓线,经典)
    HDU 3377 Plan (插头DP,变形)
    HDU 1964 Pipes (插头DP,变形)
    FZU 1977 Pandora adventure (插头DP,常规)
    URAL 1519 Formula 1 (插头DP,常规)
    POJ 1739 Tony's Tour (插头DP,轮廓线DP)
    HDU 1693 Eat the Trees (插头DP)
    hihoCoder #1162 : 骨牌覆盖问题·三 (矩阵快速幂,DP)
  • 原文地址:https://www.cnblogs.com/luxiaoyao/p/9594060.html
Copyright © 2011-2022 走看看