前端面试框架

1、对Node的优点和缺点提出了自己的看法:

*(优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,

因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。

此外,与Node代理服务器交互的客户端代码是由javascript语言编写的,

因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。

*(缺点)Node是一个相对新的开源项目,所以不太稳定,它总是一直在变,

而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。

2、需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案?

至少给出自己的思路(url-hash,可以使用已有的一些框架history.js等)

3Node.js的适用场景?

1)、实时应用:如在线聊天,实时通知推送等等(如socket.io

2)、分布式应用:通过高效的并行I/O使用已有的数据

3)、工具类应用:海量的工具,小到前端压缩部署(如grunt),大到桌面图形界面应用程序

4)、游戏类应用:游戏领域对实时和并发有很高的要求(如网易的pomelo框架)

5)、利用稳定接口提升Web渲染能力

6)、前后端编程语言环境统一:前端开发人员可以非常快速地切入到服务器端的开发(如著名的纯Javascript全栈式MEAN架构)

4(如果会用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering?

Nodejs相关概念的理解程度

5、解释一下 Backbone MVC 实现方式?

流行的MVC架构模式

6、什么是前端路由”?什么时候适合使用前端路由”? “前端路由有哪些优点和缺点?

熟悉前后端通信相关知识

前端路由就是在不进行后端请求的情况下对页面进行跳转

7、对Node的优点和缺点提出了自己的看法?

优点:

1. 因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。

2. Node代理服务器交互的客户端代码是由javascript语言编写的,因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。

缺点:

1. Node是一个相对新的开源项目,所以不太稳定,它总是一直在变。

2. 缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子(第三方库现在已经很丰富了,所以这个缺点可以说不存在了)。

1JQuery的源码看过吗?能不能简单概况一下它的实现原理?

考察学习知识的态度,是否仅仅是停留在使用层面,要知其然知其所以然

2jQuery.fninit方法返回的this指的是什么对象?为什么要返回this

this执行init构造函数自身,其实就是jQuery实例对象,返回this是为了实现jQuery的链式操作

1 jquery中如何将数组转化为json字符串,然后再转化回来?

$.parseJSON('{"name":"John"}');

JSON.stringify

2 jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

递归赋值

3 jquery.extend jquery.fn.extend的区别?

Jquery.extend用来扩展jQuery对象本身;jquery.fn.extend用来扩展jQuery实例

6、谈一下Jquery中的bind(),live(),delegate(),on()的区别?

jquery1.7以后就推荐使用on的方式来进行事件绑定了

7JQuery一个对象可以同时绑定多个事件,这是如何实现的?

可以同时绑定多个事件,低层实现原理是使用addEventListnerattachEvent兼容处理做事件注册

3 JqueryjQuery UI有啥区别?

jQuery是操作dom的框架,jQueryUI是基于jQuery做的一个UI组件库

4 jQueryZepto的区别?各自的使用场景?

jQuery主要用于pc端,当然有对应的jQuerymobile用于移动端,zeptojQuery更加小巧,主要用于移动端

jquer mobile相对于zepto功能强大,但是体积也很庞大,zepto非常的轻量

6、针对 jQuery 的优化方法?

a、优先使用ID选择器

bjquery获取到的DOM元素如果需要多次使用,建议使用一个变量将其保存起来,因为操作DOM的过程是非常耗费性能的

c、在class前使用tag(标签名)

d、给选择器一个上下文

e、慎用 .live()方法(应该说尽量不要使用)

f、使用data()方法存储临时变量

7Zepto的点透问题如何解决?

点透主要是由于两个div重合,例如:一个div调用show(),一个div调用hide();这个时候当点击上面的div的时候就会影响到下面的那个div

解决办法主要有2种:

1.github上有一个叫做fastclick的库,它也能规避移动设备上click事件的延迟响应,https://github.com/ftlabs/fastclick

将它用script标签引入页面(该库支持AMD,于是你也可以按照AMD规范,用诸如require.js的模块加载器引入),并且在dom ready时初始化在body上,

2.根据分析,如果不引入其它类库,也不想自己按照上述fastclcik的思路再开发一套东西,需要1.一个优先于下面的“divClickUnder”捕获的事件;2.并且通过这个事件阻止掉默认行为(下面的“divClickUnder”click事件的捕获,在iossafariclick的捕获被认为和滚屏、点击输入框弹起键盘等一样,是一种浏览器默认行为,即可以被event.preventDefault()阻止的行为)。

12、知道各种JS框架(Angular, Backbone, Ember, React, Meteor, Knockout...)? 能讲出他们各自的优点和缺点么?

知识面的宽度,流行框架要多多熟悉

angularbackboneknockout都是完整的MV*框架

angular是双向数据绑定的,backboneknockout是单向数据绑定的

React只是单纯地View

13Underscore 对哪些 JS 原生对象进行了扩展以及提供了哪些好用的函数方法?

Underscore的熟悉程度

14、使用过angular吗?angular中的过滤器是干什么用的

在表达式中转换数据<p>姓名为 {{ lastName | uppercase }}</p>

currency,是什么过滤器——格式化数字为货币格式,单位是$符。

 

九、移动APP开发

1、移动端最小触控区域是多大?

移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时?(click 300ms 延迟,为了实现safari的双击事件的设计,浏览器要知道你是不是要双击操作。)

14、如何理解node的同步和异步

:

同步模式就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的;异步模式则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。

15、使用node构建一个服务器并对向”/post”发起的post请求进行处理,要求拿到post请求传输的数据(不包括文件上传)

:

?

 

var http = require("http");

var queryString = require("querystring");

var server = http.createServer(function (req,res) {

 if(urlObj.pathname == "/post"){

 var str = "";

 req.on("data",function (chunk) {

 str+=chunk;

 });

 req.on("end",function () {

 var query = queryString.parse(str);

 console.log(query);

 })

 res.end("你请求的地址是"+urlObj.pathname);

 }

});

server.listen(8080);

16、用node模拟客户端发起请求

:

 

var http = require("http");

var request = http.request({

 host:"localhost",

 port:"8080",

 path:"/request",

 method:"post"

},function (res) {

 res.on("data",function (chunk) {

 console.log(chunk.toString());

 });

});

request.write("user=zhang&pass=111");

request.end("请求结束");//结束本次请求

 

 

四. angular和vue的区别

唉,这个真的太难总结了,求评论!!!

Vue拥有类似 Angular 的双向数据绑定,以及类似 React 的虚拟DOM。

angular && vue && react

 

 

五. less的特点

每次被问到这个我只能想起less中的定义变量,用太久less都忘了css不能嵌套,醉了醉了。

  1. 变量
  2. 混合(Mixins)
  3. 嵌套规则
  4. 运算
  5. 函数
  6. 命名空间
  7. 作用域
  8. 注释
  9. 导入(Import)

六. less的原理

本质上,less 包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则最终会通过解析器,less 把这些样式规则编译成浏览器可以识别的 css 样式。less 并没有裁剪 css 原有的特性,更不是用来取代 css 的,而是在现有 css 语法的基础上,为 css 加入程序式语言的特性。less 最终需要编译成 css 文件才能起到样式的效果,我们可以称 less 为 css 样式生成工具。


七. gulp的特点

  1. 使用 gulp.js,你的构建脚本是代码,而不是配置文件;
  2. 使用标准库(node.js standard library)来编写脚本;
  3. 插件都很简单,只负责完成一件事-基本上都是 20 行左右的函数;
  4. 任务都以最大的并发数来执行;
  5. Gulp是一个基于流的构建系统,使用代码优于配置的策略。输入/输出(I/O)是基于“流式”的。

作用

  1. Sass、Less编译
  2. Css Js 图片压缩
  3. Css Js 合并
  4. Css Js 内联
  5. Html的include功能
  6. Autoprefixer(自动处理浏览器css前缀)
  7. 自动刷新
  8. 去缓存
  9. Handlebars模板文件的预编译
  10. 雪碧图
  11. ESLint
  12. rem移动端适配方案

其他补充

 

gulp

grunt

速度

格式

和node差不多

json套json

操作基于

二进制流

文件

gulp VS grunt

前端工程的构建工具对比 Gulp vs Grunt

 

模块化 && 构建

dist是指distribution——分配,分发——发布完成的文件夹一般命名dist。

dest则是destination——目的地,终点——用于grunt文件路径相关的配置项,一般会和src配对出现。比如文件压缩插件:压缩源(src)文件,生成压缩包到(dest)。

作者:峰子
链接:
www.zhihu.com/question/29
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

常规GruntFile.js && gulpFile.js

  • GruntFile.js

<script>

    module.exports = function(grunt) {

        // 导入模块

        grunt.loadNpmTasks('grunt-contrib-uglify');

        grunt.loadNpmTasks('grunt-contrib-cssmin');

        grunt.loadNpmTasks('grunt-contrib-htmlmin');

        grunt.loadNpmTasks('grunt-contrib-imagemin');

        grunt.loadNpmTasks('grunt-contrib-watch');

 

        // 配置任务

        grunt.initConfig({

            // js压缩 默认加密压缩

            uglify: { // 主任务名称

                options: { // [配置选项]

                    mangle: false // 是否加密压缩

                },

                a: { // 子任务名称

                    expand: true, // 是否分开压缩

                    src: 'js/*.js',    // 源文件

                    dest: 'build'    // 目标文件 自动创建源文件文件夹

                }

            },

            cssmin: {

                a: {

                    expand: true,

                    src: 'css/*.css',

                    dest: 'build'

                }

            },

            htmlmin: {

                options: {

                    removeComments: true,    // 是否移除注释

                    collapseWhitespace: false    // 是否去掉空白

                },

                a: {

                    src: '*.html',

                    dest: 'build'

                }

            },

            // imagemin: {

            //     a: {

            //         expand: true, //分开执行

            //         cwd: 'images',

            //         src: ['**/*.{png,jpg}'],

            //         dest: 'build/images'

            //     }

            // },

            watch: {

                a: {

                    files: ['*.html', 'css/*.css', 'js/*.js'],

                    tasks: ['cssmin', 'htmlmin', 'uglify']

                }

            }

        });

 

        // 注册一个默认任务

        grunt.registerTask('default', ['uglify', 'cssmin', 'htmlmin', 'watch']);

    }

</script>

  • gulpfile.js

<script>

    // 导入模块

    var gulp = require('gulp');

    var cssmin = require('gulp-cssmin');

    var uglify = require('gulp-uglify');

    var htmlmin = require('gulp-htmlmin');

    var concat = require('gulp-concat');

    var rename = require('gulp-rename');    // 改名

 

    // 配置任务

    gulp.task('uglify:css', function() {

        gulp.src('css/*.css')

            .pipe(cssmin())        // 压缩

            .pipe(concat('all.min.css'))    // 合并

            .pipe(gulp.dest('build/css'))    // 输出

    });

    gulp.task('uglify:js', function() {

        gulp.src('js/*.js')

            .pipe(uglify())                    // 压缩

            .pipe(gulp.dest('build/js'))    // 输出

    });

    gulp.task('uglify:html', function() {

        gulp.src('*.html')

            .pipe(htmlmin({                    // 压缩

                collapseWhitespace: true,

                removeComments: true

            }))

            .pipe(gulp.dest('build'))        // 输出

    });

 

    gulp.watch('*.*', ['uglify:css', 'uglify:js', 'uglify:html']);

 

    gulp.task('default', ['uglify:css', 'uglify:js', 'uglify:html']);

</script>

<script>

    var gulp = require('gulp');

    var uglify = require('gulp-uglify');

    var clean = require('gulp-clean-css');

    var sass = require('gulp-sass');

 

    gulp.task('uglify',function(){

        return(

            gulp.src('./src/*.js')

                .pipe(uglify())

                .pipe(gulp.dest('dist'))

        )

    })

 

    gulp.task('minify-css',function(){

        return (

            gulp.src('./src/*.css')

                .pipe(clean())

                .pipe(gulp.dest('dist'))

        )

    })

 

    gulp.task('compile-sass',function(){

        return (

            gulp.src('./src/*.scss')

                .pipe(sass().on('error', sass.logError))

                .pipe(gulp.dest('dist'))

        )

    })

 

    gulp.task('default',function(){

        gulp.watch('./src/*.js',['uglify']);

        gulp.watch('./src/*.css',['minify-css']);

        gulp.watch('./src/*.scss',['compile-sass']);

    })

</script>

 

猜你喜欢

转载自blog.csdn.net/weixin_42246997/article/details/82669445