使用node搭建静态资源服务器

Posted Julie在进化

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用node搭建静态资源服务器相关的知识,希望对你有一定的参考价值。

在上一篇使用node搭建静态资源服务器(1)中,我们已经实现了基本的功能,下面继续实现进阶功能。

静态资源的压缩

//compress.js
module.exports = (rs,req,res) => {
   const acceptEncoding = req.headers[\'accept-encoding\'];
   if(!acceptEncoding || !acceptEncoding.match(/\\b(gzip|defalte)\\b/)) {
       return  rs;
   }else if(acceptEncoding.match(/\\bgzip\\b/)){
       res.setHeader(\'Content-Encoding\',\'gzip\')
       return rs.pipe(createGzip())
   }else if(acceptEncoding.match(/\\defalte\\b/)){
       res.setHeader(\'Content-Encoding\',\'gzip\')
       return rs.pipe(creatDeflate())
   }
}

对压缩文件的调用前首先要声明服务器支持对哪些文件类型进行压缩。

//服务器支持的压缩类型,config.js
module.exports = {
    root:process.cwd(),
    hostname:"127.0.0.1",
    port:9876,
    compress:/\\.(html|js|css| md|png)/,
        
    }
//对压缩类型进行调用
let rs  =  fs.createReadStream(filePath);
            if(filePath.match(config.compress)){
               rs = compress(rs,req,res)
            }
rs.pipe(res);

对文件类型的判断

我们可以对文件类型进行判断,然后设置对应正确的值,这样可以防止浏览器不能解析引起的乱码等错误。

//mimeType.js
const path = require(\'path\');

const mimeType ={
    \'css\':\'text/css\',
    \'js\':\'text/javascript\',
    \'html\':\'text/html\',
    \'json\':\'application/json\',
    \'jpeg\':\'image/jpeg\',
    \'png\':\'image/png\'

   

}
module.exports = (filePath) => {
  let ext = path.extname(filePath).split(\'.\').pop().toLocaleLowerCase();

  if(!ext) {
      ext = filePath
  }

  return mimeType[ext] || mimeType[\'html\']
}

//对类型判断方法的调用
const contentType = mimeType(filePath);
 res.setHeader(\'Content-Type\', contentType);

自定义端口等

我们在自定义的配置文件里实现了默认的端口,但我们也可以从命令行直接读取配置,这里需要用到node的yargs模块。

//index.js
const yargs = require(\'yargs\');
const Server = require(\'./app\');
const chalk = require(\'chalk\');
const argv = yargs
    .usage(\'anydoor [options]\')
    .option(\'p\',{
        alias:\'port\',
        describe:\'端口号\',
        default:9876 
    })
    .option(\'h\',{
        alias:\'hostname\',
        describe:\'host\',
        default:\'127.0.0.1\'
    })
    .option(\'d\',{
        alias:\'root\',
        describe:\'root path\',
        default:process.cwd()
    })
    .version()
    .alias(\'v\',\'version\')
    .help()
    .argv;
    

    const server = new Server(argv);
    console.log(chalk.red(argv));
    server.start();

由于要把接收的参数作为配置传递给server,所以我们要对app.js做下修改,让它合并参数,并对外暴露一个server。

const http = require("http");
const chalk = require("chalk");
const path = require(\'path\');
const route = require(\'./helper/route\')
const conf = require(\'./config/config\')

class Server {
    constructor(config) {
        this.config = Object.assign({},conf,config)
    }


    start() {
            const server = http.createServer((req, res) => {
            const filePath = path.join(this.config.root, req.url);
            route(req, res, filePath, this.config);
            
        });

        server.listen(this.config.port, this.config.hostname, () => {
            const addr = `http://${this.config.hostname}:${this.config.port}`;
            console.log(`Server started at ${chalk.green(addr)}`);
        });


    }
}

module.exports = Server;

开发完成我们就可以使用“node src/index.js -p 9999”命令来启动我们的server了,当然你也可以自定义其它信息。

以上是关于使用node搭建静态资源服务器的主要内容,如果未能解决你的问题,请参考以下文章

完整的node脚手架搭建服务

Threejs基础环境搭建(一)静态服务器

使用Express快速搭建静态资源服务器

使用Express快速搭建静态资源服务器

使用Express快速搭建静态资源服务器

node 环境下简单web服务器搭建代码