手写Vue
项目初始化
初始化项目
npm init -y
安装依赖 rollup 打包和 babel 转译
npm i rollup @babel/core rollup-plugin-babel bel @babel/preset-env -D
rollup 是一个 JavaScript 的模块打包器,一般用来编写库或者组件,因为它打包生成的文件仍然保持原来的文件结构,和 webpack 大有不同,同时也有 treeshaking 功能。
npm init
、npm i rollup -D
在根目录下新建 rollup.config.js 文件,导出一个对象
1 | // rollup.config.js |
在 package.json 中加入指令 build: rollup -c
或者 build: rollup --config
可以让根目录下的 config 生效。
1 | /** |
我们可能经常在项目中使用 css 预处理器,在 vue 中,我们可能会写成
1 | <script lang="scss"> |
这种普通的用法,仅仅是为了把 .title 省略,写起来其实与 css 并无不同,如果仅仅需要这种功能,我推荐使用 stylus,毕竟它连 { } : ;
都可以省略。
一般预处理器中都有 mixin 这个混入功能,允许你把一些 css 代码混入到指定位置。在 scss 中,使用 @mixin name 来定义。
1 | @mixin b($block) { |
调用定义好的 @mixin 方法
众所周知,小程序中有些原生组件,默认层级最高,普通的 view 无法在上面覆盖,此时需要使用 cover-view
标签。而这个标签相比于 view,缺少很多属性,使用的时候发现这里没有那里也没有。
覆盖原生组件时,只可以使用 cover-view 和 cover-image,其中 cover-view 不允许设置 background-image (因此 linear 这些渐变色背景也无法使用),可以使用 cover-image ,把内容绝对定位来替代,cover-image 不允许使用 base64,支持网络路径。
cover-view 已经支持 overflow-y: scroll
了,我在实现 map 组件上的覆盖物滚动时,使用了 touchstart, touchmove, touchend 三个事件修改 top 值来拟造滑动效果,虽然可以实现,但滑动效果非常卡,并且一旦滑动过快,会出现闪烁,touchmove 并不能完全监听到我所有的滑动,而是隔一段时间才监听到一次,看起来是内部已经做了节流处理,因此我改用了 overflow
属性带来的原生滚动,舒服多了。但从地图底部拖动到顶部时的拖动边界,仍然监听不灵敏,目前考虑将其置为按钮,不允许自定义滚动位置,仅允许滚动到两个固定位置,否则回退。
在 Vue2 的 methods,中,想定义一个高阶函数返回的方法时,this 的指向需要注意一下。
1 | // util.js |
在上面使用的过程中,在高阶函数返回的函数外部,得到的 this 是空,但同时传进去的 _this 也是空,只是因为,在页面初始化的时候,这个 mouseMove 函数已经执行了 throttle(),但是此时, Vue Components 还未被实例化,无法得到 this,因此是 undefined(小程序中,网页可能得到全局变量)。而在返回得函数中能拿到 this,是因为返回的函数是注册在 methods 中的,Vue 把 this 绑定给这个 function 了,因此这个返回的函数能拿到 this,进而 apply,也因此 methods 中真正调用的函数可以打印出 this.