亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
ES6和commonJS的選擇
單一頁面模組化
首頁 微信小程式 小程式開發(fā) 淺析小程式中如何優(yōu)雅地進行模組化處理?

淺析小程式中如何優(yōu)雅地進行模組化處理?

Dec 29, 2021 am 10:21 AM
小程式

小程式中如何優(yōu)雅地進行模組化處理?本篇文章就來手把手教大家如何優(yōu)雅的在小程式中進行模組化,希望對大家有幫助!

淺析小程式中如何優(yōu)雅地進行模組化處理?

這篇文章就講講在微信小程式中如何優(yōu)雅地進行模組化處理。透過最近的一些開發(fā)經(jīng)驗進行濃縮總結,探索一些可以提升微信小程式開發(fā)效率和降低心智負擔的方法。

ES6和commonJS的選擇

首先在微信小程式中不論是ES6 或是commonJS 模組化語法都是支援的,在傳統(tǒng)的web專案中我個人是習慣統(tǒng)一使用ES6 模組化語法進行開發(fā)的。

在最初我也是將小程式中所有的通用方法抽離成單獨的文件,並使用exportexport default 匯出,使用import 引入。

注意點

但是!在實際開發(fā)中,小程式的js檔案是不支援絕對路徑引入的!這意味著如果你需要在你的頁面中引入一個公用方法,你必須使用../../../xxx/xxx.js 的方式,當你在同一個頁面引入多個模組時,這種寫法絕對會極大的打擊你的開發(fā)熱情。

解決方式

那我們該如何解決這麼長的引入路徑呢,在web專案中,我們常常會使用路徑別名的方式,例如webpackvite 中的resolve.alias 來縮短引入的路徑。

alias: {"@src":path.resolve("src"),

但是在原生微信小程式中,雖然可以透過gulpwebpack 等一些前端工程化的工具對小程式進行一些改造,但是作為一個開源專案我希望它的啟動過程不需要太多額外配置。最好是能夠使用原生的語法去實作。

最後我選擇了在app.js中新增一個require方法用於引入模組,這樣在頁面內(nèi)引入模組時,我們只需要使用app的實例來進行模組引入,這樣可以實作使用與app.js檔案的相對路徑來引入檔案.

// app.js
App({
    require(path){
        return path
    }
})

使用方式

// 使用基于app.js的相對路徑來引入文件,這樣就避免了寫很多"../"
const app = getApp()
const upload = app.require("lib/upload")

當然這樣做也不是特別方便,首先是程式碼提示的不健全,使用以上方式的話可能對於參數(shù)或一些傳回值的提示不到位,但是影響不大。如果之後我摸索出了其他比較好的實作方式再寫一篇文章解析。其次是必須使用全域統(tǒng)一使用commonJS 的模組化語法啦,不過這一點的話問題不大。

單一頁面模組化

小程式中並沒有提供特殊的模組化方式,比較常用的就是將一些方法抽離為單獨的js文件,然後再引入。想要避免一個頁面檔案程式碼太長的話最好的方式是元件化,但是在小程式中,認為寫入元件真的是一件很不爽的事情。

小程式元件擁有自己的生命週期,而且引入時必須在頁面json中提前定義,由於元件是掛在shadow root節(jié)點上,如果想要和頁面共享樣式例如colorUI的全域樣式也需要寫入單獨的設定項styleIsolation。整體開發(fā)體驗相比vue而言比較割裂。

基於以上的一些個人看法,我在寫小程式時比較少使用元件,如果是需要抽離wxml或是js我通常使用以下的方法。

wxml模組化

在小程式中我通常使用模板template 進行抽離復用,微信小程式範本文件 ,範本相較於元件抽離的只是部分的頁面,不包含功能部分的抽離。

以下是我抽離的一個模板,這是一個文章的列表項,它並沒有什麼單獨的功能,但是代碼很長並且卻在很多頁面中復用到,於是我將它進行了一個抽離。把樣式都用行內(nèi)樣式的方式寫上,這樣在哪裡引入都是一樣的樣式。

<!-- 文章列表項 -->
<import src=&#39;./avatar&#39; />
<template name="post-item">
<view class="margin padding-sm bg-white radius flex shadow " style="position: relative;height: 350rpx;border-radius: 10rpx;">
        <!-- 背景蒙版 -->
        <view style="position: absolute;top: 0;left: 0;width: 100%;height: 100%;border-radius: 10rpx;">
                <image style="filter:blur(2px) grayscale(80%) opacity(80%)" lazy-load="{{true}}" src="{{imgList[0]}}" mode="aspectFill"></image>
        </view>
        <view style="position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(30, 30, 30, 0.8);border-radius: 10rpx;">
        </view>

        <view style="z-index: 10;width: 100%;" class="text-white">
                <!-- 文章標題 -->
                <view class="text-xl  ">
                        <text class="cu-tag margin-right-sm bg-color radius">{{topic}}</text>
                        <text class="text-bold">{{title}}</text>
                </view>
                <!-- 文章內(nèi)容 -->
                <view class="margin-top-xs text-sm text-cut">{{content}}</view>

                <view class="flex align-end justify-between margin-top">
                        <!-- 文章圖片 -->
                        <view class="flex align-center">
                                <view class="margin-xs" style="width: 120rpx;height: 120rpx;" wx:for="{{imgList}}" wx:key="{{index}}" wx:if="{{index < 3}}">
                                        <image class="radius" src="{{item}}" mode="aspectFill"></image>
                                </view>
                        </view>

                        <!-- 瀏覽量-點贊數(shù) -->
                        <view class="bg-color flex align-center text-white text-sm radius" style="padding: 4px 12px;">
                                <view class="cuIcon-attention "></view>
                                <view class="margin-left-xs">{{viewNum||0}}</view>
                                <view class="cuIcon-like margin-left"></view>
                                <view class="margin-left-xs">{{favorNum||0}}</view>
                        </view>
                </view>

                <!-- 發(fā)布時間 -->
                <view class="margin-top-xs flex align-center text-sm text-gray justify-between padding-lr-xs">
                        <view class="flex align-center">
                                <template is="avatar" data="{{size:45,avatarUrl:user.avatarUrl}}" />
                                <view class="margin-left-xs">{{user.nickName}}</view>
                        </view>

                        <view>{{createTime}}</view>
                </view>
        </view>

</view>
</template>

在頁面中使用的時候需要提前引入,由於可以引入多個模板,因此使用時需要使用is屬性 聲明使用的是哪一個template,數(shù)據(jù)的話可以通過data屬性傳入,這裡的範例是我將遍歷的item解構後再賦值進去。

<!-- 某個頁面 -->
<import src=&#39;../../template/post-item&#39; />

<template data="{{...item}}" is="post-item" />

當然使用template進行模組化進行抽離的模板程式碼可不能包涵太多的功能邏輯,具體的使用還是需要根據(jù)業(yè)務來噢。

js模組化

#

在小程序中最基本的js模塊化就是直接抽離js文件,例如一些全局通用的方法,下面展示一個全局上傳方法的封裝

// lib/upload.js
// 上傳方法
module.exports = async function upload(path) {
	return await wx.cloud.uploadFile({
		cloudPath: new Date().getTime() + path.substring(path.lastIndexOf(".")),
		filePath: path,
	})
}
// pages/form/form.js
const app = getApp()
const upload = app.require("lib/upload")
Page({
async submit() {
    wx.showLoading({
            mask: true,
            title: "發(fā)布中"
    })
    const imgList = []
    for (let img of this.data.form.imgList) {
            const uploadRes = await upload(img)
            imgList.push(uploadRes.fileID)
    }
    // ...其他業(yè)務代碼
    }
})

當然以上的辦法對于通用方法來說很方便,但是對于與 頁面操作的邏輯耦合性 很高的一些業(yè)務代碼,這樣子抽離并不方便。

在vue2中我們可以使用mixin的方法模塊化代碼,在vue3中我們可以使用hook的方式模塊化代碼,但是在小程序中并沒有以上兩者的支持,最初我想仿照 vue3的hook 方式進行頁面js封裝改造,但最終實現(xiàn)的效果不理想,于是選擇了實現(xiàn)一個模仿vue2 mixin 的方法來實現(xiàn)模塊化。

具體代碼其他博主有實現(xiàn)過,因此我就直接拿來使用了,具體代碼如下。如果不了解vue中mixin的使用方法的可以自行去官網(wǎng)看文檔,這里不做過多介紹。

// mixin.js
// 保存原生的 Page 函數(shù)
const originPage = Page
// 定義小程序內(nèi)置的屬性/方法
const prop = [&#39;data&#39;, &#39;properties&#39;, &#39;options&#39;]
const methods = [&#39;onLoad&#39;, &#39;onReady&#39;, &#39;onShow&#39;, &#39;onHide&#39;, &#39;onUnload&#39;, &#39;onPullDownRefresh&#39;, &#39;onReachBottom&#39;, &#39;onShareAppMessage&#39;, &#39;onPageScroll&#39;, &#39;onTabItemTap&#39;]

Page = (options) => {
  if (Array.isArray(options.mixins)) {
    const mixins = options.mixins
    delete options.mixins
    mixins.forEach((mixin) => {
      for (let [key, value] of Object.entries(mixin)) {
        if (prop.includes(key)) {
          // 混入屬性
          options[key] = {
            ...value,
            ...options[key]
          }
        } else if (methods.includes(key)) {
          // 混入原生方法
          const originFunc = options[key]
          options[key] = function (...args) {
            value.call(this, ...args)
            return originFunc && originFunc.call(this, ...args)
          }
        } else {
          // 混入普通方法
          options = {
            ...mixin,
            ...options
          }
        }
      }
    })
  }
  originPage(options)
}

實現(xiàn)的原理是改造小程序中的Page()函數(shù),小程序的每一個頁面都是通過調(diào)用Page({option})方法來實現(xiàn)的,在option參數(shù)中傳入頁面相關的data和聲明周期函數(shù)及其他方法。

我們通過在Page方法的參數(shù)option中增加一個mixin屬性,這個屬性可以傳入一個數(shù)組,數(shù)組即是每一個要混入的模塊,每一個模塊的結構其實與參數(shù)option是一樣的,我們只需要將所有混入的模塊與頁面自身的option進行一個參數(shù)和方法的合并就能實現(xiàn)一個mixin的功能。

使用的方法是現(xiàn)在app.js中引入mixin.js

// app.js
require("./mixins.js")
App({
// ...其他代碼
})

然后我們寫一個常規(guī)頁面的js,業(yè)務代碼大家不用看,主要關注Page的屬性中多了一個mixins選項,而mixins數(shù)組中有一個topic模塊。

// pages/form/form.js
const app = getApp()
const upload = app.require("lib/upload")
const to = app.require("lib/awaitTo")
const db = wx.cloud.database()
Page({
	mixins: [require("./mixins/topic")],
	data: {
		user: wx.getStorageSync(&#39;user&#39;),
		form: {
			title: "",
			topic: "",
			content: "",
			imgList: []
		}
	},
	chooseImg() {
		wx.chooseImage({
			count: 9 - this.data.form.imgList.length,
			sizeType: [&#39;original&#39;], //可以指定是原圖還是壓縮圖,默認二者都有
			sourceType: [&#39;album&#39;, &#39;camera&#39;], //從相冊選擇
			success: (res) => {
				res.tempFilePaths = res.tempFilePaths
				if (this.data.form.imgList.length != 0) {
					this.setData({ "form.imgList": this.data.form.imgList.concat(res.tempFilePaths) })
				} else {
					this.setData({ "form.imgList": res.tempFilePaths })
				}
			}
		});
	},
	async delImg(e) {
		const index = e.currentTarget.dataset.index
		const temp = this.data.form.imgList
		temp.splice(index, 1)
		this.setData({ "form.imgList": temp })
	}
})

由于 topic 內(nèi)都是關聯(lián)性較強的屬性與方法,因此就可以抽離出來,這樣頁面的js就會更加精簡啦,如果有更多的代碼就根據(jù)自己對于功能的判斷進行抽離,然后放在頁面對于mixin目錄中即可!

// // pages/form/mixin/topic.js
const db = wx.cloud.database()
module.exports =  {
    data:{
        topic:{
            flag:false,
            list:[]
        },
    },
    onLoad(options) {
		this.getTopic()
    },
    async getTopic(){
		const res = await db.collection("topic").get()
		this.setData({"topic.list":res.data})
	},
	
	clearTopic(){
		this.setData({"form.topic":""})
	},
	toggleTopic(e){
        console.log(e.currentTarget.dataset)
		const flag = e.currentTarget.dataset.flag
		this.setData({"topic.flag":flag})
	},
}

注意點

但是使用mixin也有著與vue中同樣的問題就是變量及方法的來源不好追溯,變量是在那個位置定義的比較難以定位,這時就更加依賴開發(fā)者的開發(fā)規(guī)范以及命名方式了,再不濟也可以每一個方法寫一個獨有的注釋嘛~

【相關學習推薦:小程序開發(fā)教程

以上是淺析小程式中如何優(yōu)雅地進行模組化處理?的詳細內(nèi)容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用Python開發(fā)微信小程式 使用Python開發(fā)微信小程式 Jun 17, 2023 pm 06:34 PM

隨著行動互聯(lián)網(wǎng)技術和智慧型手機的普及,微信成為了人們生活中不可或缺的一個應用。而微信小程式則讓人們可以在不需要下載安裝應用程式的情況下,直接使用小程式來解決一些簡單的需求。本文將介紹如何使用Python來開發(fā)微信小程式。一、準備工作在使用Python開發(fā)微信小程式之前,需要先安裝相關的Python函式庫。這裡推薦使用wxpy和itchat這兩個函式庫。 wxpy是一個微信機器

實作微信小程式中的卡片翻轉(zhuǎn)特效 實作微信小程式中的卡片翻轉(zhuǎn)特效 Nov 21, 2023 am 10:55 AM

實作微信小程式中的卡片翻轉(zhuǎn)特效在微信小程式中,實現(xiàn)卡片翻轉(zhuǎn)特效是一種常見的動畫效果,可以提升使用者體驗和介面互動的吸引力。以下將具體介紹如何在微信小程式中實現(xiàn)卡片翻轉(zhuǎn)的特效,並提供相關程式碼範例。首先,需要在小程式的頁面佈局檔案中定義兩個卡片元素,一個用於顯示正面內(nèi)容,一個用於顯示背面內(nèi)容,具體範例程式碼如下:&lt;!--index.wxml--&gt;&l

支付寶上線「漢字拾光-生僻字」小程序,用於徵集、補充生僻字庫 支付寶上線「漢字拾光-生僻字」小程序,用於徵集、補充生僻字庫 Oct 31, 2023 pm 09:25 PM

本站10月31日消息,今年5月27日,螞蟻集團宣布啟動“漢字拾光計劃”,最近又迎來新進展:支付寶上線“漢字拾光-生僻字”小程序,用於向社會徵集生僻字,補充生僻字庫,同時提供不同的生僻字輸入體驗,以幫助完善支付寶內(nèi)的生僻字輸入方法。目前,用戶搜尋「漢字拾光」、「生僻字」等關鍵字就可以進入「生僻字」小程式。在小程式裡,使用者可以提交尚未被系統(tǒng)辨識輸入的生僻字圖片,支付寶工程師確認後,將會對字庫進行補錄入。本站注意到,使用者也可以在小程式體驗最新的拆字輸入法,這項輸入法針對讀音不明確的生僻字設計。用戶拆

小程式能用react嗎 小程式能用react嗎 Dec 29, 2022 am 11:06 AM

小程式能用react,其使用方法:1、基於「react-reconciler」實作一個渲染器,產(chǎn)生一個DSL;2、建立一個小程式元件,去解析和渲染DSL;3、安裝npm,並執(zhí)行開發(fā)者工具中的建構npm;4、在自己的頁面中引入包,再利用api即可完成開發(fā)。

uniapp如何實現(xiàn)小程式和H5的快速轉(zhuǎn)換 uniapp如何實現(xiàn)小程式和H5的快速轉(zhuǎn)換 Oct 20, 2023 pm 02:12 PM

uniapp如何實現(xiàn)小程式和H5的快速轉(zhuǎn)換,需要具體程式碼範例近年來,隨著行動網(wǎng)路的發(fā)展和智慧型手機的普及,小程式和H5成為了不可或缺的應用形式。而uniapp作為一個跨平臺的開發(fā)框架,可以在一套程式碼的基礎上,快速實現(xiàn)小程式和H5的轉(zhuǎn)換,大大提高了開發(fā)效率。本文將介紹uniapp如何實現(xiàn)小程式和H5的快速轉(zhuǎn)換,並給出具體的程式碼範例。一、uniapp簡介unia

教你如何在小程式中用公眾號範本訊息(附詳細想法) 教你如何在小程式中用公眾號範本訊息(附詳細想法) Nov 04, 2022 pm 04:53 PM

這篇文章給大家?guī)砹岁P於微信小程式的相關問題,其中主要介紹瞭如何在小程式中用公眾號範本訊息,下面一起來看一下,希望對大家有幫助。

用Python編寫簡單的聊天程式教程 用Python編寫簡單的聊天程式教程 May 08, 2023 pm 06:37 PM

實現(xiàn)思路x01服務端的建立首先,在服務端,使用socket進行訊息的接受,每接受一個socket的請求,就開啟一個新的線程來管理訊息的分發(fā)與接受,同時,又存在一個handler來管理所有的線程,從而實現(xiàn)對聊天室的各種功能的處理x02客戶端的建立客戶端的建立就要比服務端簡單多了,客戶端的作用只是對消息的發(fā)送以及接受,以及按照特定的規(guī)則去輸入特定的字符從而實現(xiàn)不同的功能的使用,因此,在客戶端這裡,只需要去使用兩個線程,一個是專門用於接受消息,一個是專門用於發(fā)送消息的至於為什麼不用一個呢,那是因為,只

PHP與小程式的地理位置定位與地圖顯示 PHP與小程式的地理位置定位與地圖顯示 Jul 04, 2023 pm 04:01 PM

PHP與小程式的地理位置定位與地圖顯示地理位置定位與地圖顯示在現(xiàn)代科技中已經(jīng)成為了必備的功能之一。隨著行動裝置的普及,人們對於定位和地圖顯示的需求也越來越高。在開發(fā)過程中,PHP和小程式是常見的兩種技術選擇。本文將為大家介紹PHP與小程式中的地理位置定位與地圖顯示的實作方法,並附上對應的程式碼範例。一、PHP中的地理位置定位在PHP中,我們可以使用第三方地理位

See all articles