Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲天堂三区,亚洲国产精品一区二区久久 ,亚洲欧洲日韩在线

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          現代前端CSS的救星?《從 Tailwind CSS 到 UnoCSS - 原子化》

          念-原子化CSS

          原子化 CSS 是一種 CSS 的架構方式,它傾向于小巧且用途單一的 class,并且會以視覺效果進行命名。

          聽起來厲害,但實現的最終方式超級簡單,核心就是預置一大堆 class 樣式,盡量將這些 class 樣式簡單化、單一化,在開發過程中,可以直接在 DOM 中寫預置好的 class 名快速實現樣式,而不需要每次寫簡單枯燥大量的 css 樣式,如下代碼所示:

          1. 先預置一組class列表
          .m-10 { margin: 10px; }
          .p-5 { padding: 5px; }
          .text-red { color: red; }
           // 無數個....
          1. 編碼時在dom中直接寫class名,快速實現樣式
          <div class="m-10 p-5 text-red">
            測試dom
          </div>

          而預置的class列表中的樣式,有著一定的規律,開發者可以通過學習快速掌握,利用多個class在dom中的組合快速實現效果

          Tailwind CSS 廣受歡迎

          Cover image for 4 Reasons why I start using Tailwind CSS in every project

          Tailwind CSS 主張讓你無需離開 HTML 即可快速構建網站,并有許多非常非常實用的優點

          • 對 class 極致的封裝,最大程度提高復用性
          • 易擴展的的各種自定義配置
          • 構建時清除未引用的 css 樣式,解決生產環境 CSS 冗余的問題
          • 舒適的響應式開發體驗
          • 函數、指令、布局、動畫,......等等

          幾乎囊括了開發者日常原生 CSS 開發中遇到的所有頭痛,不舒服的開發體驗,所以說他確實是很實用的工具。Tailwind CSS 真的是為前端開發者造福了。

          在前端構建工具鏈中 Tailwind CSS 作為 PostCSS[4] 插件可與其他預處理器[5]結合使用,并優化生成的 CSS 文件。。

          UnoCSS

          Tailwind CSS 在過去幾年廣受歡迎,近兩年 UnoCSS 又脫穎而出,這里需要先夸一下 UnoCSS 官網的圖標&文字&背景色的色彩漸變聯動主題,很酷??!

          Cover image for UnoCSS, Vite + Vue3 easy setup

          按 UnoCSS 作者的說法,UnoCSS 并非要替代 Tailwind CSS 而是從另一個角度使原子化CSS在業務中融合的更完美。

          UnoCSS 作者是 Vite 團隊成員,我覺得正是因為他作為 Vite 的開發者,對于工程化構建具有很高的敏感度,所以才能創造出 UnoCSS 將原子化的CSS與前端工程融合到極致。

          那么 UnoCSS 做了哪些事呢:

          1. 按需生成
          2. 生成業務真正使用到的 class ,同時在開發和生產環境使用
          3. 對比 Tailwind CSS 只在生產環節清除無引用代碼,UnoCSS 在開發環節也通過文件監聽按需傳輸,獲得更快地性能(雖然已經很快了,但再快一點總歸是個提升嘛)

          "傳統的方式"

          "按需分配的方式"

          1. 極具靈活性
          2. UnoCSS 對自己定位是一個 CSS 引擎而非一個框架,所以它與 Tailwind CSS 應該是包含關系,UnoCSS 作為規則的制定者,而 Tailwind CSS 可以作為其中的一組 preset


          import UnocssPlugin from '@unocss/vite'
          
          import PresetTachyons from '@unocss/preset-tachyons'
          import PresetBootstrap from '@unocss/preset-bootstrap'
          import PresetTailwind from '@unocss/preset-tailwind'
          import PresetWindi from '@unocss/preset-windi'
          import PresetAntfu from '@antfu/oh-my-cool-unocss-preset'
          
          export default {
            plugins: [
              UnocssPlugin({
                presets: [
                  // PresetTachyons,
                  PresetBootstrap,
                  // PresetTailwind,
                  // PresetWindi,
                  // PresetAntfu
                  // 選擇其中一個...或多個!
                ]
              })
            ]
          }

          屬性化書寫 class 名

          // 將冗長的 calss 按類型區分,更方便閱讀理解
          <button class="bg-blue-400 hover:bg-blue-500 text-sm text-white font-mono font-light py-2 px-4 rounded border-2 border-blue-200 dark:bg-blue-500 dark:hover:bg-blue-600">
            Button
          </button>
          
          // 改變為
          <button 
            bg="blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600"
            text="sm white"
            font="mono light"
            p="y-2 x-4"
            border="2 rounded blue-200"
          >
            Button
          </button>
          1. 在自定義規則上,UnoCSS 提供更加靈活的靜態&動態匹配規則
          2. 編譯進一步優化(比如不再解析AST),生產構建速度再度提升

          UnoCSS 等于是做了個更上層的引擎,以后再有新的原子化CSS框架也可以兼容進來了,省得你有選擇困難癥。

          原子化CSS并非現代前端CSS的救星

          Tailwind CSS 與 UnoCSS 的特性和使用方法并非本文主要想講的,具體細節大家可移步官網查看,這里主要想討論下

          Tailwind CSS 或 UnoCSS 的原子化CSS 會是現代前端解決CSS問題的最佳實踐嗎?

          我覺得答案是否定的


          從我的直接觀感,原子化CSS更像是一個輔助型的實用工具,而非CSS問題的解決方案,作為輔助工具,它確實是能在某類業務場景或者業務發展的某個階段提供非常大的幫助,但從整個復雜多變的前端業務場景上看,它的能力是有限的。

          • 最直觀的的結果就是當業務復雜度提升到某個階段后,原子化CSS的性價比將急劇下降,帶來的HTML代碼冗余,可讀性差,難以維護的問題將直接影響到業務開發。
          • 尤其是現在無論是 Vue 的單文件組件還是 React 的函數式組件,都會將部分 JS 邏輯注入 HTML 中,如果 CSS 邏輯也要通過 class 名組合的方式注入其中,那就太混亂了。
          • 但 Vue 或 React 各自的組件化設計思想,都可以通過各自的組件化拆分來解決代碼冗余的問題,使其可適用于各種簡單&復雜的業務場景,是一套完善的最佳實踐,而原子化CSS 沒有辦法做組件化拆分的,所以隨著業務復雜度的上升,代碼冗余遲早會發生,這直接限制了此類框架的普及,所以它無法作為前端CSS問題的根本解決方案。

          從設計思想上,原子化CSS看起來也與目前主流的組件化,函數式編程顯得格格不入。

          適用場景

          在一些簡單的業務場景上,原子化CSS確實有非常大的優勢,比如快速開發響應式H5,業務復雜度低的中后臺系統,簡單的官網頁面。

          而在一些復雜的業務場景,比如復雜的C端業務,大型的系統就不在那么適用了。


          從 Tailwind CSS 到 UnoCSS —— 原子化真的是現代前端CSS的救星嗎
          原文鏈接:https://juejin.cn/post/7293786856063205385

          者:鄭振波

          轉發鏈接:https://www.yuque.com/xwifrr/khuqsn/mgxnoe

          生產環境下,每次打包構建后,都會生成hash值不用的文件,造成了很多冗余的文件,因此我們需要引入一個插件來在打包的時候先清理目錄。

          npm i clean-webpack-plugin -D

          webpack.prod.js的配置如下:

          const { resolve } = require('path');
          const HtmlWebpackPlugin = require('html-webpack-plugin');//打包html
          const MiniCssExtractPlugin = require('mini-css-extract-plugin');//分離樣式
          const CssMinimizerWebpackPlugin = require('css-minimizer-webpack-plugin');//壓縮css
          const { CleanWebpackPlugin } = require('clean-webpack-plugin');//打包前清理文件夾
          const { merge } = require('webpack-merge');
          const commonConfig = require('./webpack.base.js');
          let prodConfig = {
            entry: './src/main.js',
            output: {
              filename: 'bundle-[name]-[chunkhash].js',
              path: resolve(__dirname, '../dist')
            },
            module: {
              rules: [
                {
                  test: /\.css$/,
                  use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader']
                },
                {
                  test: /\.less$/,
                  use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'less-loader']
                },
                {
                  test: /\.scss$/,
                  use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader']
                },
                {
                  test: /\.js$/,
                  exclude: /node_modules/,
                  loader: 'babel-loader',
                  options: {
                    cacheDirectory: true//開啟babel緩存
                  }
                },
              ]
            },
            plugins: [
              //清理目錄
              new CleanWebpackPlugin(),
              // 打包html
              new HtmlWebpackPlugin({
                template: './src/assets/index.html',
                hash: true,
                filename: 'index.html',
                favicon: './src/assets/favicon.ico',
                minify: {
                  collapseWhitespace: true,//移除空格
                  removeComments: true,//移除注釋
                }
              }),
              // 壓縮css
              new CssMinimizerWebpackPlugin(),
              // 分離css
              new MiniCssExtractPlugin({
                filename: 'index-[name]-[contenthash].css'
              })
            ],
            mode: 'production',
            target: 'es5',
          }
          module.exports = merge(commonConfig, prodConfig);

          package.json的配置如下:

          {
            "name": "wpk5-demo",
            "version": "1.0.0",
            "description": "",
            "main": "index.js",
            "scripts": {
              "serve": "npx webpack serve --config ./build/webpack.dev.js",
              "build": "npx webpack --config ./build/webpack.prod.js"
            },
            "keywords": [],
            "author": "",
            "license": "ISC",
            "devDependencies": {
              "@babel/core": "^7.13.14",
              "@babel/preset-env": "^7.13.12",
              "babel-loader": "^8.2.2",
              "clean-webpack-plugin": "^4.0.0-alpha.0",
              "css-loader": "^5.2.0",
              "css-minimizer-webpack-plugin": "^1.3.0",
              "eslint": "^7.23.0",
              "eslint-config-airbnb-base": "^14.2.1",
              "eslint-loader": "^4.0.2",
              "eslint-plugin-import": "^2.22.1",
              "file-loader": "^6.2.0",
              "html-loader": "^2.1.2",
              "html-webpack-plugin": "^5.3.1",
              "less": "^4.1.1",
              "less-loader": "^8.0.0",
              "mini-css-extract-plugin": "^1.4.0",
              "node-sass": "^5.0.0",
              "postcss-loader": "^5.2.0",
              "postcss-preset-env": "^6.7.0",
              "sass-loader": "^11.0.1",
              "style-loader": "^2.0.0",
              "url-loader": "^4.1.1",
              "webpack": "^5.28.0",
              "webpack-cli": "^4.5.0",
              "webpack-dev-server": "^3.11.2",
              "webpack-merge": "^5.7.3"
            },
            "dependencies": {
              "core-js": "^3.10.0",
              "regenerator-runtime": "^0.13.7"
            }
          }

          git倉庫地址:

          https://gitee.com/seimin/xiaoming2qianduan-webpack5/tree/v5.15/

          主站蜘蛛池模板: 在线电影一区二区三区| 国产成人一区二区三区在线观看| 精品福利一区3d动漫| 中文字幕国产一区| 国产经典一区二区三区蜜芽| 精品国产一区二区三区久久狼| 亚洲国产一区视频| 免费无码AV一区二区| 日韩成人无码一区二区三区| 国产福利91精品一区二区| 国偷自产av一区二区三区| 成人日韩熟女高清视频一区| 插我一区二区在线观看| 538国产精品一区二区在线| 精品视频午夜一区二区| 相泽南亚洲一区二区在线播放| 亚洲综合av一区二区三区| 国产香蕉一区二区在线网站| 人妻体体内射精一区二区| 亚洲一区二区在线免费观看| 亚洲伦理一区二区| 亚洲国产成人久久综合一区 | 国产成人精品无码一区二区老年人| 精品国产乱码一区二区三区 | 国产高清精品一区| 午夜视频久久久久一区 | 国产在线一区二区三区av| 欧美激情国产精品视频一区二区| 偷拍激情视频一区二区三区| 亚洲国产一区二区三区在线观看 | 国产精品女同一区二区久久 | 美女福利视频一区二区| 麻豆视传媒一区二区三区| 一区二区三区四区精品| 国产凹凸在线一区二区| 激情内射亚洲一区二区三区| 无码视频一区二区三区| 一区二区三区在线播放视频| 美女视频在线一区二区三区| 久久精品一区二区三区AV| 麻豆国产在线不卡一区二区|