面试常被问到原生微信小程序的几个问题及个人感受

简单的一下从去年9月底找实习到现在面过的几家公司,和几次模拟面试时的考点。写这个主要是因为自己有两个项目是微信小程序,面试的时候每次都会问到,而且很多时候问的还不少。

个人建议:如果没有必要,一开始真的别学原生小程序开发,有时间多看看js,vue(react),甚至想不开了去学uniapp都比这强。

这里只是写一点基础相关的东西。业务相关的(例如:申请微信支付及打款,二维码,发布流程,云服务)或者其它细节的东西可以评论区交流。要有不对的地方或者什么建议也欢迎在评论区里提出来。

一、小程序和普通网页开发的区别(详见微信官方文档)

1.网页开发渲染线程(渲染DOM)和脚本线程(执行JavaScript脚本)是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应。而在小程序中是分开的。

2.网页开发者可以使用到各种浏览器暴露出来的 DOM API,进行 DOM 选中和操作。小程序的逻辑层和渲染层是分开的,逻辑层运行在 JSCore 中,并没有一个完整浏览器对象,因而缺少相关的DOM API和BOM API。这一区别导致了前端开发非常熟悉的一些库,例如 jQuery等,在小程序中是无法运行的。同时 JSCore 的环境同 NodeJS 环境也是不尽相同,所以一些 NPM 的包在小程序中也是无法运行的。

3.​网页开发者需要面对的环境是各式各样的浏览器,而小程序需要面对的是 iOS 和 Android 的微信客户端,以及微信开发者工具。

4.网页开发者在开发网页的时候,只需要使用到浏览器,并且搭配上一些辅助工具或者编辑器即可。小程序的开发则有所不同,需要经过申请小程序帐号、安装小程序开发者工具、配置项目等等过程方可完成。

二、小程序的逻辑层和渲染层

PS:第一次面试的第一道题,不写也忘不了了~

WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层。

小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了WebView 进行渲染;逻辑层采用 JsCore 线程运行 JS 脚本。一个小程序存在多个界面,所以渲染层存在多个 WebView 线程,这两个线程的通信会经由Native(微信客户端)做中转,逻辑层发送网络请求也经由 Native 转发。

三、wxml,wxss和html,css的区别

wxml:对小程序常用的组件(例如:日历,弹窗,地图等)进行了封装,且wxml标签更单一(小程序:view,web端:div)。

wxss:rpx;项目初始化时app.wxss的全局样式;语法层面支持大部分css特性(例如:不支持background:url())

四、小程序适配

PS:这个问题甚至一共被问到了三次,现在觉得面试官问这个东西要这样先引申一下,知道面试官想问什么,例如:

  • web端、移动端和小程序端各自的适配方法?

web端和移动端百度都能找到答案,小程序端见下一问。

  • 小程序端不同机型之间的适配?

个人感觉实际开发中,flex布局+rpx(和vw、vh)完全可以满足绝大多数的需求(至少我是没遇到过不能满足的,可能是我太菜了),只要用好这些,微信开发者工具里调成不同机型后布局效果基本一致,如果不能满足,一般也会换一种设计方案来实现功能。

所以我被问到后除了上面的那段,都是答rpx(调试的时候用iPhone6这个机型,把px乘2转化成rpx,在不同机型中,小程序会自动根据转化比率将rpx转化成对应的px),还有vw和vh。

  • 宽屏适配?

也是写这段答案的时候才发现有这个东西的,以前我也没注意到,也没有被问到过,具体可以看看微信官方文档。

五、小程序的生命周期(和vue或react连着问)

lifetimes: {
	//新版基础库调用方式只能用lifetimes,不能直接把钩子写在外面
    attached: function() {},
    detached: function() {},
	//created,ready,moved,error
  },
pageLifetimes: {
    show: function() {
      // 页面被展示
    },
    hide: function() {
      // 页面被隐藏
    },
    resize: function(size) {
      // 页面尺寸变化
    }
  }
#前端##面试##面经##小程序##前端工程师#
全部评论

相关推荐

面试官人很好,态度和蔼可亲,没答出来时也会引导你去思考。由于是晚上面的,导致我白天一天都有点紧张,面的时候状态也不是很好,正常可能面试官提问完应该思考几秒再答,而我就像抢答一样一口气把所有会的都说出来,这样就导致逻辑比较混乱,东一句西一句的。首先是自我介绍,先把会的技术大致讲一下,由于我八股背的多所以着重讲了一下,Java,go,jvm,MySQL,Redis,计网,操作系统这些,然后一小部分闲聊,然后先问了一下项目,面试官问我这个项目是否落实之类的,直接坦言说是写的练手的,包括之前也写过IM通讯,外卖之类的。然后面试官就把提问的重点放在了八股上。先问了Java:类加载器(答:3种+自定义类加载器、tomcat、原因+双亲委派+好处)JVM参数(答:xmx,xms,newsize这些,问我是如何设定的,我回答是把内存分一半给堆,再把堆分一半给新生代,这方面确实不太了解)然后问了一下并发相关的:线程池(答:线程池的7个参数(忘了线程工厂和阻塞时间了),3个重要参数,还有线程如何启用,为什么要设计最大线程数之类的,提到Java栈默认分配1MB运行时不可以更改)AQS(答:先讲clh是自旋锁+list,然后是AQS在这个基础上做的两个优化,然后举了一下reentrantlock根据state如何获取资源)CAS(答:使用三个字段,aba问题,然后将通常搭配自旋锁实现,面试官问通常会自旋多少次,这个不太了解,答的100,然后问100次大概多少秒,回答微秒级,然后面试官讲了一下怎么做资源可能没用完,意识到可能还需要进行阻塞操作)然后考虑一下Linux命令(top,ps,如何使用管道符过滤线程和使用Linux启动线程没答出来)然后问Redis:持久化机制(答:三种aof,rdb,混合,aof的三个参数刷盘策略,rdb以快照保存,使用bgsave会使用子线程来保存不会阻塞,而aof虽然会阻塞但是只在写完数据后追加一条命令,不会太影响,然后是他俩的优缺点,还有混合是怎么保存数据的)集群模式(答:三种,主从复制到缺点再到哨兵机制,正常使用三个哨兵互相监督,主节点挂了投票选主哨兵然后选主节点,然后额外讲一下脑裂的问题,主节点进行数据更新然后把命令写入aof来同步从节点,最后cluster集群,如何实现,使用16383个哈希槽(艹答成16384了),先根据哈希码取余,再根据节点数取余决定放在哪个节点上,然后问了一下我会怎么选集群模式,首先是cluster的问题,会让管道操作之类的失效,然后哨兵会导致整个集群结构变得复杂,使用小项目可能会考虑哨兵,大的考虑cluster,然后考了一下cluster如果一个节点挂了怎么办,根据节点数重新取余然后数据转移,面试官说这么转移比较慢,有没有别的办法,我隐约记得使用一个类似环形数组的方式,想不起来了)然后考了一下MySQL的b+树(这方面的知识点太多了,导致我什么都想讲逻辑就比较乱,讲了一下聚簇索引,树的叶子节点对应着一张页16KB,MySQL有一个区的概念,把这些页放在同一个区中,这样叶子节点的双向链表遍历时速度更快,然后b+树的扇出比较大(非常二,说成扇度之类的,面试官以为说的是扇区)这样层数就比较小,一行1kb数据的话3层可以放心2000w数据)其他的暂时想不起来了算法是lru,面试官问要不要提示,我说写个,然后写了10分钟左右,说大概写好了,但是面试官指出了2个小错误,第一个马上就改回来了,第二个一直没看出来(大脑这时候已经停止工作了)反问:问学习建议,说根据实际的项目进行深入,考虑应该怎么做,还问了一下组里面是做Java的吗?面试官说他是做go的,组里什么语言都有,语言影响不大,连忙补充了一句我对go的底层有深入源码的学习)结束。总体感觉答得不太好,没有太体现出深度,细节也不够全面。
下一个更好呗:佬,我投完云智一直没消息,多久约的一面啊
查看14道真题和解析
点赞 评论 收藏
分享
评论
19
53
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务