摘要:起因作為前端工程師,日常開發(fā)離不開文件。對于來說,市面上已經(jīng)有如,體驗也很不錯,但是需要下載同學(xué)提供的龐大的才能進行標(biāo)注體驗。而且有時候還是需要同學(xué)給龐大的文件,我們才能在中自動標(biāo)注。
起因
作為前端工程師,日常開發(fā)離不開 psd 文件。
但是日常開發(fā)的一個小彈窗頁面,它的 psd 居然需要 30+Mb,所以經(jīng)常得定期清理 psd...
對于我一個 PS 小菜雞來說,用 PSD 無非只是需要用來度量元素大?。ㄔ亻g距),查看屬性等簡單的功能。
思考,對比相對比于 sketch,sketch 具有 sketch-measure,設(shè)計師導(dǎo)出成靜態(tài)資源給前端即可。
對于 PSD 來說,市面上已經(jīng)有如 pxcook / lanhuapp,體驗也很不錯,但是需要下載 U 同學(xué)提供的 (龐大的) psd 才能進行標(biāo)注體驗。
而且有時候還是需要 U 同學(xué)給(龐大的) PSD 文件,我們才能在 pxcook / lanhuapp 中自動標(biāo)注。
于是鑒于以上,考慮做一個開源項目,類似于 sketch-measure, 定位為 psd-measure。
效果展示DEMO
源碼,歡迎 star
我們也可以使用命令行來導(dǎo)出頁面標(biāo)注
bash
npm i measure-export-cli -g # 開啟服務(wù),在線預(yù)覽 `path/to/psdDir` 下的 psd measure-export start path/to/psdDir # 構(gòu)建 `path/to/psdDir` 下的 psd 至 `dist` 文件目錄 measure-export build path/to/psdDirChrome 插件
提供 Chrome 插件,當(dāng)我們點擊 psd 鏈接時候跳出 Measure UI,而不是下載 PSD,當(dāng)然我們也可以點擊右上方的下載進行下載。
安裝下載擴展,點擊下載
打開 Chrome 擴展頁面: chrome://extensions/
拖拽下載的包至頁面中進行安裝
出現(xiàn)該圖標(biāo)表示安裝完成
流程如下:
PSD 文件格式介紹File Header(定長) 主要包括這個 psd 文件整體的數(shù)據(jù),如版本,尺寸大小,圖片通道數(shù),使用的顏色類別(rgb、cmyk...)
Color Mode Data Section(變長) 主要是部分顏色類型圖片需要用到
Image Resources(變長) 放置一些外部的圖片資源
Layer and Mask(變長) 放置圖層和蒙層的各種信息,大小位置,字體,描邊等等
Image Data(變長) 放置圖像像素數(shù)據(jù)
PSD.js使用 psd.js 便是解析上述文件結(jié)構(gòu),得到可讀的數(shù)據(jù)結(jié)構(gòu)。
其中 psd.js 使用 getter 得到懶解析數(shù)據(jù),即如下代碼:
const obj = Object.defineProperty({}, "someParsedVal", { get: function () { if (!this._someParsedVal) { const afterMs = Date.now() + 3000 while (true) { if (Date.now() >= afterMs) { this._someParsedVal = "ok" break } } } return this._someParsedVal } }) obj.someParsedVal // 3s 后出來 obj.someParsedVal // 很快
在 mobx3 中也有類似的設(shè)計(LazyInitializer)
psd-html將 PSD 解析為 HAST,進而轉(zhuǎn)換為 HTML
HAST (HTML 抽象語法樹)如下 html:
對應(yīng) HAST 為
{ "type": "element", "tagName": "a", "properties": { "href": "http://alpha.com", "id": "bravo", "className": ["bravo"], "download": true }, "children": [] }前后端同構(gòu)
前后端同構(gòu)的意思:同時運行在客戶端和服務(wù)端,具體便是同時執(zhí)行在瀏覽器環(huán)境和 nodejs 環(huán)境
實現(xiàn)前后端同構(gòu)的一些常用方式,借助構(gòu)建工具 browserify / rollup / webpack 來分別打包不同環(huán)境的 js
在 nodejs 環(huán)境,對于 nodejs built-in modules 不進行打包
在 browser 環(huán)境,則將預(yù)設(shè)的 built-in modules 打包進去,以及一些 global 變量(如 process.env / __dirname)也會進行 mock
如 webpack 配置 DefinePlugin
{ plugins: [ new webpack.DefinePlugin({ "process.env.RUN_ENV": JSON.stringify("browser") }) ] }
在代碼中對不同環(huán)境打包進行區(qū)分
module.exports = process.env.RUN_ENV === "browser" ? { psdToHtml, psdToHtmlFromBuffer, psdToHtmlFromURL, psdToHAST, psdToHASTFromBuffer } : { psdToHtml, psdToHtmlFromPath, psdToHtmlFromBuffer, psdToHAST, psdToHASTFromBuffer, psdToHASTFromPath }
最終打包出來的 js 則會剔除掉 psdToHASTFromPath 相關(guān)代碼
如下:
{ "main": "dist/psd-html.cjs.js", "browser": "dist/psd-html.browser.cjs.js", "cdn": "dist/psd-html.browser.umd.min.js", "unpkg": "dist/psd-html.browser.umd.min.js" }
main: nodejs 環(huán)境加載的 js
browser: browser 環(huán)境加載的 js
cdn: 部分 cdn 服務(wù)加載的 js
unpkg: unpkg cdn 服務(wù)加載的 js (主要使用 UMD 規(guī)范打包)
直接訪問 https://unpkg.com/@moyuyc/psd... 則會重定向至 https://unpkg.com/@moyuyc/psd...{latest-version}/dist/psd-html.browser.umd.min.js
html-measure 交互 布局定位將 psd 導(dǎo)出成整個圖片,利用每一個圖層的定位和大小來自動標(biāo)注。
其他2 個 div,相對與同一個父級的絕對定位,如何判斷他們是否相交?
.
.
.
.
.
.
.
.
.
.
正面直接判斷是很費力的,要考慮各種情況,這時候需要逆向思維,考慮不相交的情況。
這時候就簡單了
不相交只要滿足下面四種情況之一就可以
function isIntersect(node1, node2) { const rect1 = node1.getBoundingClientRect() const rect2 = node2.getBoundingClientRect() return !( rect1.right < rect2.left || rect1.left > rect2.right || rect1.bottom < rect2.top || rect1.top > rect2.bottom ) }measure-export(-cli)
輸入 psd / html 導(dǎo)出 meas-ui 靜態(tài)資源,流程如圖(區(qū)分 prod 和 dev 環(huán)境)
.svg)
Todo[ ] 提供 chrome 插件:當(dāng)瀏覽器打開 psd 時候,渲染測量尺寸 UI
相關(guān)項目@moyuyc/psd.js - 解析 psd 文件,格式化 (Forked from psd.js)
@moyuyc/psd-html - psd -> hast -> html
html-measure - 標(biāo)注交互
meas-ui - 前端 UI 展示,包含標(biāo)注交互
measure-export(-cli) - 輸入 psd / html 導(dǎo)出 meas-ui 靜態(tài)資源
參考資料Adobe Photoshop File Formats Specification PS 文件格式官方標(biāo)準(zhǔn)
Photoshop Styles File Format
JS. 如何判斷兩個矩形是否相交
HAST
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/97946.html
摘要:藍湖通過幫助設(shè)計師更好地向團隊展示設(shè)計圖描述頁面之間的跳轉(zhuǎn)關(guān)系。如果設(shè)計圖出現(xiàn)改動和更新,藍湖也能自動添加新版本。藍湖基于這些反饋快速迭代,而自動標(biāo)注功能就是其中一項。 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動態(tài),大家一起多交流學(xué)習(xí),共同進步,以學(xué)習(xí)者的身份寫博客,記錄點滴。 工欲善其事,必先利其器。我只是...
摘要:藍湖通過幫助設(shè)計師更好地向團隊展示設(shè)計圖描述頁面之間的跳轉(zhuǎn)關(guān)系。如果設(shè)計圖出現(xiàn)改動和更新,藍湖也能自動添加新版本。藍湖基于這些反饋快速迭代,而自動標(biāo)注功能就是其中一項。 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動態(tài),大家一起多交流學(xué)習(xí),共同進步,以學(xué)習(xí)者的身份寫博客,記錄點滴。 工欲善其事,必先利其器。我只是...
摘要:所以實現(xiàn)小圖標(biāo)時雪碧圖跟圖標(biāo)字體會在一個網(wǎng)站共存,自定義圖標(biāo)字體為什么比較耗時,且太復(fù)雜圖標(biāo)無法實現(xiàn)請往下看開發(fā)流程就了解了。參考資料細談淺談圖標(biāo)字體向下兼容優(yōu)雅降級技術(shù)繪制小圖標(biāo)技巧雪碧圖圖標(biāo)字體矢量小圖標(biāo)設(shè)計本文對應(yīng)源碼源碼地址演示地址 showImg(https://segmentfault.com/img/bVRnAC?w=431&h=220); 之前寫了一篇關(guān)于雪碧圖的博文,...
閱讀 1709·2021-09-02 15:11
閱讀 2035·2019-08-30 14:04
閱讀 2613·2019-08-27 10:52
閱讀 1634·2019-08-26 11:52
閱讀 1260·2019-08-23 15:26
閱讀 2701·2019-08-23 15:09
閱讀 2684·2019-08-23 12:07
閱讀 2288·2019-08-22 18:41