@@ -198,3 +198,212 @@ export default {
198
198
### checkMPEntry
199
199
在 [ 项目建构] ( /build/#module ) 文档的这个部分,有讲到需要给所有 ` js ` 后缀文件增加 ` mpvue-loader ` ,并且需要加 options,通过这个配置,我们的 loader 才能知道 entry 进来的 js 和 vue 的类型是 app 还是 page,从而做了一些页面类型的区分。
200
200
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)
0 commit comments