Skip to content

Commit c54522c

Browse files
authored
Merge pull request #19 from sexdevil/master
mpvue-lint
2 parents 949adef + ded63eb commit c54522c

File tree

7 files changed

+269
-0
lines changed

7 files changed

+269
-0
lines changed

docs/assets/mpvue-lint/1.png

127 KB
Loading

docs/assets/mpvue-lint/2.jpg

35 KB
Loading

docs/build/mpvue-lint.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# mpvue-lint
2+
3+
>针对很多需要h5和小程序页面同构开发的场景,开发者会出现很多h5的vue组件直接搬到mpvue中调试的开发流程。虽然mpvue支持大部分的vue语法,但是仍有些边界
4+
情况需要开发者自行处理。为了提升开发效率,我们提供mpvue-lint插件。目前有两个功能模块,语法检查模块和内存检查模块
5+
6+
# mpvue-lint 语法检查
7+
语法检查模块,mpvue-lint检测h5版本的vue组件是否符合mpvue语法规则
8+
9+
##使用方法 npm install mpvue-lint
10+
构建流中调用,传入entry(array) ,要检查的入口Vue文件列表 ,示例代码:
11+
```javascript
12+
const mpvueLint = require('mpvue-lint')
13+
mpvueLint.build(
14+
{
15+
entry:
16+
[
17+
path.resolve('mpvue/page/worldcup/home/index.vue'),
18+
path.resolve('mpvue/page/worldcup/card_detail/index.vue'),
19+
path.resolve('mpvue/page/worldcup/activity_rules/index.vue')
20+
]
21+
})
22+
```
23+
24+
如果有引用路径的错误,会报白色提示</br>
25+
如果有template错误,比如组件上用class,绑定click事件等会报**红色**错误名,文件名,和组件名</br>
26+
如果Vue文件方法里有写法错误,如使用zepto,window,document等,会报**红色**错误名,文件名,方法名,行号</br>
27+
如果想自定义需要报错的函数调用,请按照**mpvuelint.json**里的格式添加你的函数名,例如,"zepto":true会在 vue文件中所有调用zepto的地方报错提醒</br>
28+
lint检查非强制阻拦编译过程,FE同学自己根据提醒修改业务代码
29+
30+
运行结果如图:</br>
31+
<img src="../../assets/mpvue-lint/1.png" width="800" alt="语法检查">
32+
33+
# mpvue-trace 内存检查
34+
>内存检查模块,mpvue-trace辅助开发者检查操作时数据更新的变化,因为最后小程序更新数据需要调用setData接口,而setData小程序真机是
35+
通过把JSON对象转换字符串传递给实际的页面的,大块数据会造成页面卡顿,甚至极端情况会造成页面少渲染一部分(更新数据过大会丢弃一部分更新)。
36+
为了开发者更直观看到mpvue页面每次更新数据量,这个插件会检查每次数据更新后500ms内整个页面的数据更新总量。
37+
38+
##使用方法 npm install mpvue-lint
39+
在mpvue/你的工作目录/你的页面目录/main.js中加入如下引用
40+
```javascript
41+
const mpvueTrace = require('mpvue-lint/mpvue-trace')
42+
mpvueTrace.trace(Vue); //Vue是当前页面中的Vue实例
43+
```
44+
##使用注意!
45+
上面的调试代码会监听Vue.$updateDataToMP方法并把更新数据转字符串计算大小,会有一定性能损耗,仅做调试trace用,**上线代码一定要去除**
46+
47+
#源码
48+
49+
> mpvue-lint的源码已在github上开源[github 地址请参见](https://github.com/mpvue/mpvue-lint) 欢迎开发者们根据自己项目的情况灵活增减功能
50+
51+
源码基本原理图:</br>
52+
<img src="../../assets/mpvue-lint/2.jpg" style="margin:0 auto;display:block;" width="400" alt="语法检查流程">
53+
54+

docs/build/mpvue-loader.md

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,3 +198,212 @@ export default {
198198
### checkMPEntry
199199
[项目建构](/build/#module) 文档的这个部分,有讲到需要给所有 `js` 后缀文件增加 `mpvue-loader` ,并且需要加 options,通过这个配置,我们的 loader 才能知道 entry 进来的 js 和 vue 的类型是 app 还是 page,从而做了一些页面类型的区分。
200200

201+
## TypeScript支持
202+
`mpvue-loader`目前支持用TypeScript来写,功能还在完善中(WIP)。目前实现了用`<script lang="ts" src="./xx.ts"></script>`这种方式的自动识别,并且需要搭配[vue-property-decorator](https://github.com/kaorun343/vue-property-decorator)来使用。
203+
204+
### 配置
205+
206+
#### 添加对应的`loader`
207+
```js
208+
// webpack.conf.js
209+
module.exports = {
210+
//...
211+
module: {
212+
rules: [
213+
{
214+
test: /\.vue$/,
215+
loader: 'mpvue-loader',
216+
options: {
217+
//...
218+
ts: [ //添加对应vue的loader
219+
'babel-loader',
220+
{
221+
// loader: 'ts-loader',
222+
loader: 'awesome-typescript-loader',
223+
options: {
224+
// errorsAsWarnings: true,
225+
useCache: true,
226+
}
227+
}
228+
]
229+
}
230+
},
231+
// ts文件的loader
232+
{
233+
test: /\.tsx?$/,
234+
exclude: /node_modules/,
235+
use: [
236+
'babel-loader',
237+
{
238+
loader: 'mpvue-loader',
239+
options: {
240+
checkMPEntry: true
241+
}
242+
},
243+
{
244+
// loader: 'ts-loader',
245+
loader: 'awesome-typescript-loader',
246+
options: {
247+
// errorsAsWarnings: true,
248+
useCache: true,
249+
}
250+
}
251+
]
252+
},
253+
]
254+
// ...
255+
}
256+
```
257+
### main.ts
258+
```ts
259+
// main.ts
260+
import { Component, Emit, Inject, Model, Prop, Provide, Vue, Watch } from 'vue-property-decorator';
261+
import { VueConstructor } from "vue";
262+
263+
interface IMpVue extends VueConstructor {
264+
mpType: string
265+
}
266+
267+
// 添加小程序hooks http://mpvue.com/mpvue/#_4
268+
Component.registerHooks([
269+
// app
270+
'onLaunch', // 初始化
271+
'onShow', // 当小程序启动,或从后台进入前台显示
272+
'onHide', // 当小程序从前台进入后台
273+
// pages
274+
'onLoad', // 监听页面加载
275+
'onShow', // 监听页面显示
276+
'onReady', // 监听页面初次渲染完成
277+
'onHide', // 监听页面隐藏
278+
'onUnload', // 监听页面卸载
279+
'onPullDownRefresh', // 监听用户下拉动作
280+
'onReachBottom', // 页面上拉触底事件的处理函数
281+
'onShareAppMessage', // 用户点击右上角分享
282+
'onPageScroll', // 页面滚动
283+
'onTabItemTap', //当前是 tab 页时, 点击 tab 时触发 (mpvue 0.0.16 支持)
284+
])
285+
286+
Vue.config.productionTip = false
287+
// 在这个地方引入是为了registerHooks先执行
288+
const MyApp = require('./App.vue').default as IMpVue
289+
const app = new Vue(MyApp)
290+
app.$mount()
291+
```
292+
### App.vue
293+
```vue
294+
<script lang="ts" src="./app.ts"></script>
295+
<style></style>
296+
```
297+
```ts
298+
//app.ts
299+
import { Vue, Component } from 'vue-property-decorator'
300+
declare module "vue/types/vue" {
301+
interface Vue {
302+
$mp: any;
303+
}
304+
}
305+
306+
// 必须使用装饰器的方式来指定components
307+
@Component({
308+
mpType: 'app', // mpvue特定
309+
}as any)
310+
class App extends Vue {
311+
// app hook
312+
onLaunch() {
313+
let opt = this.$root.$mp.appOptions
314+
}
315+
316+
onShow() {
317+
}
318+
319+
onHide() {
320+
}
321+
322+
mounted() { // vue hook
323+
}
324+
}
325+
326+
export default App
327+
```
328+
### 页面
329+
```vue
330+
<!-- page.vue -->
331+
<template>
332+
<div class="counter-warp">
333+
<p>Mpvue</p>
334+
<p>ts value {{ ver }}</p>
335+
<card text="card component"></card>
336+
<comp-b text="card component"></comp-b>
337+
<a :href="AppUrls.COUNTER" class="home">去往vuex</a>
338+
</div>
339+
</template>
340+
<!--必须指定为ts-->
341+
<script lang="ts" src="./index.ts"></script>
342+
<style></style>
343+
```
344+
```ts
345+
// index.ts
346+
import { Vue, Component } from 'vue-property-decorator'
347+
import Card from '@/components/card.vue' // mpvue目前只支持的单文件组件
348+
import CompB from '@/components/compb.vue' // mpvue目前只支持的单文件组件
349+
// 必须使用装饰器的方式来指定component
350+
@Component({
351+
components: {
352+
Card,
353+
CompB, //注意,vue的组件在template中的用法,`CompB` 会被转成 `comp-b`
354+
},
355+
})
356+
class Index extends Vue {
357+
ver: number = 123
358+
359+
onShow() { // 小程序 hook
360+
}
361+
362+
mounted() { // vue hook
363+
}
364+
}
365+
366+
export default Index
367+
```
368+
369+
### 组件
370+
```vue
371+
<!-- card.vue -->
372+
<template>
373+
<div>
374+
<p class="card">
375+
From Card {{text}} {{ver}}
376+
</p>
377+
</div>
378+
</template>
379+
<!--必须指定为ts-->
380+
<script lang="ts" src="./card.ts"></script>
381+
<style></style>
382+
```
383+
```ts
384+
// card.ts
385+
import { Vue, Component, Prop } from 'vue-property-decorator'
386+
// 必须使用装饰器的方式来指定component
387+
@Component
388+
class Card extends Vue {
389+
@Prop({ default: '1' }) //注意用法!
390+
text: string;
391+
392+
ver: number = 2;
393+
394+
onShow() {
395+
}
396+
397+
onHide() {
398+
}
399+
400+
mounted() { // vue hook
401+
}
402+
}
403+
404+
export default CompB
405+
```
406+
407+
### 示例Demo
408+
409+
示例: [mpvue-ts-demo](https://github.com/WingGao/mpvue-ts-demo)

docs/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Owl.start({
5454
- [mpvue-webpack-target](/build/mpvue-webpack-target) webpack 构建目标
5555
- [postcss-mpvue-wxss](/build/postcss-mpvue-wxss) 样式代码转换预处理工具
5656
- [px2rpx-loader](/build/px2rpx-loader) 样式转化插件
57+
- [mpvue-lint](/build/mpvue-lint) 开发辅助插件,包括语法检查,内存检查等功能
5758
- 其它
5859

5960

docs/mpvue/index.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,10 @@ mpvue 可以支持小程序的原生组件,比如: `picker,map` 等,需要
390390
</picker>
391391
```
392392

393+
## TypeScript支持
394+
395+
目前`mpvue-loader`是可以支持TypeScript选项的,配置方法[在此](/build/mpvue-loader/#typescript)。具体Demo可以见[mpvue-ts-demo](https://github.com/WingGao/mpvue-ts-demo)
396+
393397
## 最佳实践
394398

395399
**1. 精简 data 数据**

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pages:
1414
- [build/mpvue-webpack-target.md, Build ]
1515
- [build/postcss-mpvue-wxss.md, Build]
1616
- [build/px2rpx-loader.md, Build]
17+
- [build/mpvue-lint.md, Build]
1718
- [qa.md, Q&A]
1819

1920
extra:

0 commit comments

Comments
 (0)