@@ -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)
0 commit comments