<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們知道WindiCSS
的組態檔既支援js
字尾也支援ts
字尾,即:windi.config.js
和windi.config.ts
我們在 vscode 安裝的WindiCSS IntelliSense
也支援讀取多種字尾格式的組態檔。vscode 基於 electron 實現,electron 底層是一個node.js + v8
的整合終端,支援執行 js 格式的程式碼,WindiCSS IntelliSense
最終打包出來的執行的程式碼也是 js 格式的程式碼
那WindiCSS IntelliSense
是怎麼實現 js 檔案載入 ts 檔案的呢?
這個問題困惑了我大半天,正好最近在寫腳手架,需要支援載入 ts 字尾的組態檔
於是下定決心,把這個問題搞清楚,最後終於在原始碼裡找到了答案
WindiCSS IntelliSense
原始碼直接clone
下來$ git clone https://github.com/windicss/windicss-intellisense.git
<!--srclibindex.ts--> // ... async init() { try { const config = await this.loadConfig(); this.processor = new Processor( config ) as Processor; this.attrPrefix = this.processor.config('attributify.prefix') as | string | undefined; this.variants = this.processor.resolveVariants(); this.colors = flatColors( this.processor.theme('colors', {}) as colorObject ); this.register(); } catch (error) { Log.error(error); } } // ...
<!--srclibindex.ts--> // ... import { loadConfig } from 'unconfig'; // ... async loadConfig(file?: string) { if(!workspace.workspaceFolders) return; const { config, sources } = await loadConfig<Config>({ sources: [ { files: 'windi.config', extensions: ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'], }, { files: 'tailwind.config', extensions: ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'], }, ], merge: false, cwd: workspace.workspaceFolders[0].uri.fsPath, }); Log.info(`Loading Config File: ${sources}`); return config; } // ...
從關鍵實現的程式碼上看,我們就找到了答案:使用unconfig來實現載入不同字尾的檔案
看到這裡,我們還是沒有搞懂:為什麼js
能載入ts
,我們繼續深入瞭解一下unconfig
的內部實現
unconfig
原始碼直接clone
下來git clone https://github.com/antfu/unconfig.git
<!--srcindex.ts--> // ... import jiti from 'jiti' // ... async function loadConfigFile<T>(filepath: string, source: LoadConfigSource<T>): Promise<LoadConfigResult<T> | undefined> { let config: T | undefined let parser = source.parser || 'auto' let bundleFilepath = filepath let code: string | undefined async function read() { if (code == null) code = await fs.readFile(filepath, 'utf-8') return code } if (source.transform) { const transformed = await source.transform(await read(), filepath) if (transformed) { bundleFilepath = join(dirname(filepath), `__unconfig_${basename(filepath)}`) await fs.writeFile(bundleFilepath, transformed, 'utf-8') code = transformed } } if (parser === 'auto') { try { config = JSON.parse(await read()) parser = 'json' } catch { parser = 'require' } } try { if (!config) { if (typeof parser === 'function') { config = await parser(filepath) } else if (parser === 'require') { config = await jiti(filepath, { interopDefault: true, cache: false, requireCache: false, v8cache: false, esmResolve: true, })(bundleFilepath) } else if (parser === 'json') { config = JSON.parse(await read()) } } if (!config) return const rewritten = source.rewrite ? await source.rewrite(config, filepath) : config if (!rewritten) return undefined return { config: rewritten, sources: [filepath], } } catch (e) { if (source.skipOnError) return throw e } finally { if (bundleFilepath !== filepath) await fs.unlink(bundleFilepath).catch() } } // ...
<!--srcindex.ts--> // ... import jiti from 'jiti' // ... async function loadConfigFile<T>(filepath: string, source: LoadConfigSource<T>): Promise<LoadConfigResult<T> | undefined> { // ... try { if (!config) { if (typeof parser === 'function') { config = await parser(filepath) } else if (parser === 'require') { config = await jiti(filepath, { interopDefault: true, cache: false, requireCache: false, v8cache: false, esmResolve: true, })(bundleFilepath) } else if (parser === 'json') { config = JSON.parse(await read()) } } // ... } // ...
從關鍵實現的程式碼上看,我們就找到了答案:使用jiti來實現 js 檔案載入 ts 檔案時,動態編譯 ts 檔案並返回結果。
jiti
檔案中這麼描述:Runtime typescript and ESM support for Node.js (CommonJS),我們可以更加粗暴地理解為require-ts
。
為了讓大家更好地理解unconfig
的工作流程,樓主根據上述的unconfig
核心程式碼,整理出一個unconfig核心工作原理流程圖
關於js
檔案如何載入ts
檔案的疑惑得以解開
看過沒練過,等於沒看過 - B 站夢覺教游泳
我們在寫腳手架的時候可以直接使用unconfig
讀取組態檔即可,例如:讀取vite.config.ts
可以這麼實現
import { loadConfig } from 'unconfig' const { config } = await loadConfig({ sources: [ { files: 'vite.config', async rewrite(config) { return await (typeof config === 'function' ? config() : config) }, }, ] })
以上就是WindiCSS實現載入windi.config.ts組態檔詳解的詳細內容,更多關於WindiCSS載入windi.config.ts的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45