1、对Node的优点和缺点提出了自己的看法:
*(优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,
因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。
此外,与Node代理服务器交互的客户端代码是由javascript语言编写的,
因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
*(缺点)Node是一个相对新的开源项目,所以不太稳定,它总是一直在变,
而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。
2、需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案?
至少给出自己的思路(url-hash,可以使用已有的一些框架history.js等)
3、Node.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当年的样子(第三方库现在已经很丰富了,所以这个缺点可以说不存在了)。
1、JQuery的源码看过吗?能不能简单概况一下它的实现原理?
考察学习知识的态度,是否仅仅是停留在使用层面,要知其然知其所以然
2、jQuery.fn的init方法返回的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的方式来进行事件绑定了
7、JQuery一个对象可以同时绑定多个事件,这是如何实现的?
可以同时绑定多个事件,低层实现原理是使用addEventListner与attachEvent兼容处理做事件注册
3、 Jquery与jQuery UI有啥区别?
jQuery是操作dom的框架,jQueryUI是基于jQuery做的一个UI组件库
4、 jQuery和Zepto的区别?各自的使用场景?
jQuery主要用于pc端,当然有对应的jQuerymobile用于移动端,zepto比jQuery更加小巧,主要用于移动端
jquer mobile相对于zepto功能强大,但是体积也很庞大,zepto非常的轻量
6、针对 jQuery 的优化方法?
a、优先使用ID选择器
b、jquery获取到的DOM元素如果需要多次使用,建议使用一个变量将其保存起来,因为操作DOM的过程是非常耗费性能的
c、在class前使用tag(标签名)
d、给选择器一个上下文
e、慎用 .live()方法(应该说尽量不要使用)
f、使用data()方法存储临时变量
7、Zepto的点透问题如何解决?
点透主要是由于两个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事件的捕获,在ios的safari,click的捕获被认为和滚屏、点击输入框弹起键盘等一样,是一种浏览器默认行为,即可以被event.preventDefault()阻止的行为)。
12、知道各种JS框架(Angular, Backbone, Ember, React, Meteor, Knockout...)么? 能讲出他们各自的优点和缺点么?
知识面的宽度,流行框架要多多熟悉
angular、backbone、knockout都是完整的MV*框架
angular是双向数据绑定的,backbone、knockout是单向数据绑定的
React只是单纯地View层
13、Underscore 对哪些 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不能嵌套,醉了醉了。
- 变量
- 混合(Mixins)
- 嵌套规则
- 运算
- 函数
- 命名空间
- 作用域
- 注释
- 导入(Import)
六. less的原理
本质上,less 包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则最终会通过解析器,less 把这些样式规则编译成浏览器可以识别的 css 样式。less 并没有裁剪 css 原有的特性,更不是用来取代 css 的,而是在现有 css 语法的基础上,为 css 加入程序式语言的特性。less 最终需要编译成 css 文件才能起到样式的效果,我们可以称 less 为 css 样式生成工具。
七. gulp的特点
- 使用 gulp.js,你的构建脚本是代码,而不是配置文件;
- 使用标准库(node.js standard library)来编写脚本;
- 插件都很简单,只负责完成一件事-基本上都是 20 行左右的函数;
- 任务都以最大的并发数来执行;
- Gulp是一个基于流的构建系统,使用代码优于配置的策略。输入/输出(I/O)是基于“流式”的。
作用
- Sass、Less编译
- Css Js 图片压缩
- Css Js 合并
- Css Js 内联
- Html的include功能
- Autoprefixer(自动处理浏览器css前缀)
- 自动刷新
- 去缓存
- Handlebars模板文件的预编译
- 雪碧图
- ESLint
- rem移动端适配方案
其他补充
gulp |
grunt |
|
速度 |
快 |
慢 |
格式 |
和node差不多 |
json套json |
操作基于 |
二进制流 |
文件 |
模块化 && 构建
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>