前端面试题整理—Node篇

一、node有哪些特征,与其余服务器端对比前端

  特征:单线程、事件驱动、非阻塞I/Ovue

  node 没法直接渲染静态页面,提供静态服务node

  node 没有根目录的概念webpack

  node 必须经过路由程序指定文件才能渲染文件web

  node 比其余服务端性能更好,速度更快数据库

 

二、CommonJS中require/exports和ES6中import/export区别npm

  CommonJS模块的重要特性是加载时执行,及脚本代码在require的时候,就会所有执行。一旦出现某个模块被“循环加载”就只输出已经执行的部分,尚未执行的部分是不输出的编程

  ES6模块是动态引用,若是使用import从一个模块加载变量,那些变量不会缓存,而是成为一个指向被加载模块的引用,impor/export最终都是编译为require/exports来执行的json

 

三、谈谈对node.js npm webpack的理解跨域

  ebpack可以把.vue后缀名的文件打包成浏览器可以识别的js,而这个.vue文件装换须要打包器vue-loader;这个vue-loader打包器是能够从npm上面下载,npm下载文件以后;webpack打包文件的时须要node环境去运行

 

四、使用npm有哪些好处?

  经过NPM,你能够安装和管理项目的依赖,而且可以指明依赖项的具体版本号,能够经过package.json文件来管理项目信息,配置脚本

 

五、AMD CMD规范的区别

  CommonJS和AMD都是JavaScript模块化规范

  CMD依赖就近,而AMD依赖前置

  CMD是延迟执行的,而AMD是提早执行的

  AMD的API默认是一个当多个用,CMD的API严格区分,推崇职责单一

 

六、如何判断当前脚本运行在浏览器仍是node环境中

  经过判断 Global 对象是否为 window ,若是不为window ,当前脚本没有运行在浏览器中

 

七、简述同步和异步的区别,如何避免回调地狱

  同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为

  异步方法调用一旦开始,方法调用就会当即返回,调用者就能够继续后续的操做。而异步方法一般会在另一个线程中,整个过程,不会阻碍调用者的工做

  避免回调地狱:

  1)Promise

  2)async/await

  3)generator

  4)事件发布/监听模式

  

八、几种常见模块化规范的简介

   CommonJS规范主要用于服务端编程,加载模块是同步的,这并不适合在浏览器环境,由于同步意味着阻塞加载,浏览器资源是异步加载的

  AMD规范在浏览器环境中异步加载模块,并且能够并行加载多个模块。不过,AMD规范开发成本高,代码的阅读和书写比较困难

  CMD规范与AMD规范很类似,都用于浏览器编程,依赖就近,延迟执行,能够很容易在Node.js中运行(依赖SPM 打包,模块的加载逻辑偏重)

  ES6 在语言标准的层面上,实现了模块功能,并且实现得至关简单,彻底能够取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案

 

九、app.use和app.get区别

  app.use(path,callback)中的callback既能够是router(路由)对象又能够是函数

  app.get(path,callback)中的callback只能是函数

 

十、说一下事件循环eventloop 

  1)全部同步任务都在主线程上执行,造成一个执行栈

  2)当主线程中的执行栈为空时,检查事件队列是否为空,若是为空,则继续检查;如不为空,则执行3

  3)取出任务队列的首部,加入执行栈

  4)执行任务

  5)检查执行栈,若是执行栈为空,则跳回第 2 步;如不为空,则继续检查

 

十一、node怎么跟MongoDB创建链接

  1)引入mongoose

  2)使用mongoose.connect()方法链接到MongoDB数据库

  3)监听链接是否成功

  4)而后经过node,书写接口,对数据库进行增删改查

 

十二、node 和 前端项目怎么解决跨域的

   经过在node服务器端设置

        //解决跨域问题
        app.use(async(ctx, next) => {
            
            //指定服务器端容许进行跨域资源访问的来源域。能够用通配符*表示容许任何域的JavaScript访问资源,可是在响应一个携带身份信息(Credential)的HTTP请求时,必需指定具体的域,不能用通配符
            ctx.set("Access-Control-Allow-Origin", "*");

            //可选。它的值是一个布尔值,表示是否容许客户端跨域请求时携带身份信息(Cookie或者HTTP认证信息)。默认状况下,Cookie不包括在CORS请求之中。当设置成容许请求携带cookie时,须要保证"Access-Control-Allow-Origin"是服务器有的域名,而不能是"*";若是没有设置这个值,浏览器会忽略这次响应。
            ctx.set("Access-Control-Allow-Credentials", true);
            
            //指定服务器容许进行跨域资源访问的请求方法列表,通常用在响应预检请求上
            ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE");
            
            //必需。指定服务器容许进行跨域资源访问的请求头列表,通常用在响应预检请求上
            ctx.set("Access-Control-Allow-Headers", "x-requested-with, accept, origin, content-type");
            // ctx.set("X-Powered-By", ' 3.2.1');
            
            //告诉客户端返回数据的MIME的类型,这只是一个标识信息,并非真正的数据文件的一部分
            ctx.set("Content-Type", "application/json;charset=utf-8");
            
            //若是不设置mode,直接设置content-type为application/json,则fetch会默认这是跨域模式(mode:'cors'),在跨域POST以前,客户端会先发一条OPTIONS请求来”探探路”,若是服务器容许,再继续POST数据。对于这种OPTIONS请求,须要在服务器配置容许接受OPTIONS请求,这样写就是直接容许了全部的OPTIONS请求,也能够按照需求来判断OPTIONS请求中更详细的信息
            if (ctx.request.method == "OPTIONS") {
                ctx.response.status = 200
            }
            await next();
        });
相关文章
相关标签/搜索