中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信小程序轉換器之loader的實現方法

發布時間:2021-01-19 10:00:52 來源:億速云 閱讀:292 作者:小新 欄目:移動開發

這篇文章主要介紹了微信小程序轉換器之loader的實現方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

配置文件中的loader配置

可以根據配置文件匹配到到規則,去執行相應的loader。

// analyze.config.js
// 引入loader
const jsLoader = require('./lib/jsLoader')
const jsonLoader = require('./lib/jsonLoader')
const cssLoader = require('./lib/cssLoader')
const htmlLoader = require('./lib/htmlLoader')
const signLoader = require('./lib/signLoader')
const config = {
    entry: './',
    output: {
        name: 'dist',
        src: './'
    },
    module: [
        {
            test: /\.js$/,
            loader: [signLoader, jsLoader],
        },
        {
            test: /\.wxss$/,
            loader: [cssLoader],
            outputPath: (outputPath) => outputPath.replace('.wxss', '.acss')
        },
        {
            test: /\.wxml$/,
            loader: [htmlLoader],
            outputPath: (outputPath) => outputPath.replace('.wxml', '.axml')
        },
        {
            test: /\.json$/,
            loader: [jsonLoader],
        },
    ]
}
module.exports = config

具體loader實現
以jsLoader為例子,接收源碼作為參數,返回編譯后獲得的新的源碼

// 前幾篇中封裝的js轉換器
const JsParser = require('./JsParser')
function loader(source) {
    
    const jsParser = new JsParser()
    let ast = jsParser.parse(source)
    ast = jsParser.astConverter(ast)
    return jsParser.astToCode(ast)
}
module.exports = loader

不同文件選擇對應loader

// 重寫Analyze函數中的analyzeFileToLoard文件分析部分
function Analyze(filePath, outputPath){
    if (fs.statSync(filePath).isDirectory()) {
        const files = fs.readdirSync(filePath)
        files.forEach(file => {
            const currentFilePath = filePath+'/'+file
            const currentOutputPath = outputPath+'/'+file
            if(fs.statSync(currentFilePath).isDirectory()) {
                fs.mkdirSync(currentOutputPath)
                Analyze(currentFilePath, currentOutputPath)
            } else analyzeFileToLoard(currentFilePath, currentOutputPath)
        })
    } else analyzeFileToLoard(filePath, outputPath)
}
function analyzeFileToLoard(inputPath, outputPath) {
    let source = readFile(inputPath) // 讀取源碼
    const loaders = config.module
    loaders.forEach(loader => { // 遍歷配置文件,看是否有匹配文件的loader規則
        if (loader.test.test(inputPath)) {
            // 使用loader
            source = useLoader(source, loader.loader, outputPath)
            // 輸出路徑處理函數
            if (loader.outputPath) outputPath = loader.outputPath(outputPath)
        }
    })
    writeFile(outputAppPath(outputPath), source) // 將處理過后的源碼寫入文件
}

loader過濾和執行

loader執行是個逆序的執行,從右邊向左依次執行。在這里我們先用同步的loader來做討論。
loader執行前還有個pitch階段,感覺pitch這個起名方式并不是特別合適,我更愿意叫它過濾篩選階段。先去順序執行loader上的pitch方法,要是pitch有返回值,就不再執行在該loader之前執行的loader。

function useLoader(source, loaders = []) {
    // 執行loader存儲列表
    const loaderList = []
    // 遞歸去篩選需要執行的loader
    function loaderFilter(loaders) {
        const [firstLoader, ...ortherLoader] = loaders
        if (loaders.length === 0) return
        // 執行pitch,并將剩余的loader傳入作為參數
        if (firstLoader.pitch && firstLoader.pitch(ortherLoader)) return ortherLoader
        else {
            // 將可用loader加入待執行列表
            loaderList.push(firstLoader)
            // 剩余loader作為參數 遞歸調用
            loaderFilter(ortherLoader)
        }
    }
    // 大概,暫時用不到。。。
    const remainLoader = loaderFilter(loaders)
    // 同步loader逆序執行
    function runLoader(source, loaderList) {
        const loader = loaderList.pop()
        let newSource = loader(source)
        if (loaderList.length > 0) return runLoader(newSource, loaderList)
        else return newSource
    }
    source = runLoader(source, loaderList)
    return source
}

實驗
寫個signLoader,看看loader能不能像我們想的那樣逆序執行

function loader(source) {
let sign = `/**
* @Author: LY
*/
`
    source = sign + source
    return source
}
module.exports = loader

結果:

這樣簡易的loader部分算是完成了,但這么寫只能執行一些同步的loader,異步的loader無法等待執行完成后再寫入。

微信小程序轉換器之loader的實現方法

感謝你能夠認真閱讀完這篇文章,希望小編分享的“微信小程序轉換器之loader的實現方法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

娱乐| 剑河县| 疏附县| 德庆县| 丘北县| 达州市| 红桥区| 保山市| 明溪县| 青神县| 普宁市| 阜城县| 陇川县| 绩溪县| 西乌| 邵东县| 花莲市| 利辛县| 梁平县| 广宗县| 南召县| 建水县| 鄯善县| 双江| 镶黄旗| 巨鹿县| 卓资县| 西乌珠穆沁旗| 新邵县| 邵阳市| 文成县| 洞头县| 沿河| 盐源县| 吉水县| 浮梁县| 肇东市| 吉木乃县| 浦北县| 柳州市| 皮山县|