


Statik Pertama: Laman Jamstack Pra-Dihasilkan dengan Rendering Tanpa Pelayan sebagai sandaran
Apr 16, 2025 am 11:06 AMSenibina Jamstack semakin meningkat dan ia memberikan kaedah yang cekap untuk membina sebuah laman web.
Salah satu prinsip teras Jamstack adalah pra-penanaman. Ini bermakna menghasilkan satu siri sumber statik terlebih dahulu untuk membolehkan perkhidmatan pelawat dari CDN atau persekitaran hosting statik yang dioptimumkan pada kelajuan terpantas dan overhead terendah.
Tetapi jika kita pra-menghasilkan laman web terlebih dahulu, bagaimanakah kita dapat membuat mereka kelihatan lebih dinamik? Bagaimana untuk membina laman web yang memerlukan perubahan yang kerap? Bagaimana cara mengendalikan kandungan yang dihasilkan oleh pengguna?
Malah, ini adalah senario aplikasi yang ideal untuk fungsi tanpa pelayan. Jamstack dan Serverless adalah rakan kongsi terbaik, mereka saling melengkapi dengan sempurna.
Artikel ini akan meneroka corak: Di laman web yang terdiri hampir seluruh kandungan yang dihasilkan oleh pengguna, menggunakan fungsi tanpa pelayan sebagai penyelesaian sandaran untuk halaman yang telah dijana. Kami akan menggunakan teknik penghalaan URL yang optimis di mana halaman 404 adalah fungsi tanpa pelayan untuk menambah penambahan tanpa pelayan.
Kedengarannya rumit? Mungkin. Tetapi adakah ia berfungsi? Benar -benar berkesan!
Anda boleh mencuba laman web demo untuk mengetahui tentang kes penggunaan ini. Walau bagaimanapun, sila cuba selepas membaca artikel ini.
Anda kembali? Hebat, mari kita menyelam ke dalamnya.
Falsafah laman web sampel ini adalah: membolehkan anda membuat mesej hangat dan mesej galakan maya untuk dihantar kepada rakan -rakan. Anda boleh menulis mesej, menyesuaikan lollipop (atau popsicle, untuk rakan -rakan Amerika saya) dan dapatkan URL untuk berkongsi dengan penerima anda. Itu sahaja, anda telah menerangi hari mereka. Apa yang lebih baik daripada ini?
Secara tradisinya, kami akan menggunakan beberapa skrip sisi pelayan untuk memproses penyerahan borang, menambah lollipop baru (kandungan yang dihasilkan oleh pengguna kami) ke pangkalan data dan menghasilkan URL yang unik. Kami kemudian menggunakan lebih banyak logik sisi pelayan untuk menghuraikan permintaan ke halaman ini, menanyakan pangkalan data untuk mendapatkan data yang diperlukan untuk mengisi paparan halaman, memberikan templat yang sesuai, dan mengembalikannya kepada pengguna.
Ini kelihatan munasabah.
Tetapi berapa kos untuk berkembang?
Arkitek teknikal dan penyelia teknikal sering menghadapi masalah ini ketika menilai skop sesuatu projek. Mereka perlu merancang, membayar dan memperuntukkan sumber yang cukup untuk mengatasi situasi yang berjaya.
Laman web lollipop maya ini bukan hiasan biasa. Oleh kerana kita semua mahu menghantar mesej positif yang lain, laman web ini akan menjadikan saya seorang jutawan! Apabila berita menyebar, tahap lalu lintas akan melambung. Saya lebih baik mempunyai strategi yang baik untuk memastikan pelayan dapat mengendalikan beban berat. Saya mungkin menambah beberapa tier cache, beberapa pengimbang beban, dan saya akan merekabentuk pelayan pangkalan data dan pangkalan data saya supaya saya dapat berkongsi beban tanpa dibanjiri oleh keperluan untuk membuat dan menyediakan semua lollipop ini.
Tetapi ... Saya tidak tahu bagaimana melakukan perkara -perkara ini.
Dan saya tidak tahu berapa banyak kos untuk menambah infrastruktur ini dan memastikan mereka berjalan. Ini rumit.
Itulah sebabnya saya suka mempermudahkan hosting saya sebanyak mungkin dengan pra-rendering.
Menyediakan halaman statik adalah lebih mudah dan lebih murah daripada menyediakan halaman secara dinamik dari pelayan web yang memerlukan beberapa logik untuk menghasilkan pandangan untuk setiap pelawat atas permintaan.
Oleh kerana kami sedang mengusahakan banyak kandungan yang dihasilkan oleh pengguna, masih masuk akal untuk menggunakan pangkalan data, tetapi saya tidak akan menguruskannya sendiri. Sebaliknya, saya akan memilih salah satu daripada banyak pilihan pangkalan data yang boleh digunakan sebagai perkhidmatan. Saya akan berinteraksi dengannya melalui APInya.
Saya mungkin memilih Firebase, MongoDB, atau mana -mana lagi pangkalan data. Chris menyusun beberapa sumber ini di laman web yang hebat mengenai sumber tanpa pelayan, yang patut diterokai.
Dalam kes ini, saya memilih Fauna sebagai datastore saya. Fauna menyediakan API yang hebat untuk menyimpan dan menanyakan data. Ia adalah kedai data gaya bukan SQL, dan ia adalah apa yang saya perlukan.
Secara kritis, Fauna telah menjadikannya perniagaan lengkap untuk menyediakan perkhidmatan pangkalan data. Mereka mempunyai pengetahuan domain yang mendalam yang tidak akan saya miliki. Dengan menggunakan pembekal pangkalan data-sebagai-perkhidmatan seperti ini, saya mewarisi pasukan perkhidmatan data pakar untuk projek saya , termasuk infrastruktur ketersediaan, keupayaan dan keselamatan pematuhan yang tinggi, jurutera sokongan mahir, dan dokumentasi yang luas.
Daripada melakukannya sendiri, gunakan perkhidmatan pihak ketiga seperti itu, yang merupakan kekuatannya.
Senibina TL; DR
Apabila berurusan dengan bukti konsep, saya sering mendapati diri saya merenung beberapa aliran logik. Inilah coretan yang saya buat untuk laman web ini:
Dan beberapa penjelasan:
- Pengguna membuat lollipop baru dengan mengisi borang HTML biasa.
- Kandungan baru disimpan dalam pangkalan data, dan penyerahannya mencetuskan penjanaan dan penempatan tapak baru.
- Sebaik sahaja laman web ini digunakan, Lollipop baru akan dapat diakses melalui URL yang unik. Ia akan menjadi halaman statik yang cepat dihidangkan dari CDN tanpa bergantung pada pertanyaan pangkalan data atau pelayan.
- Tiada lollipop baru boleh diakses sebagai halaman statik sehingga penjanaan tapak selesai. Permintaan yang tidak berjaya ke halaman Lollipop akan kembali ke halaman yang secara dinamik menjana halaman Lollipop melalui API Database Query Dynamic.
Pendekatan ini mula-mula menganggap sumber statik/pra-dihasilkan dan kemudian kembali kepada rendering dinamik apabila pandangan statik tidak tersedia, yang dipanggil "statik pertama", seperti yang diterangkan oleh Markus Schork Unilever, yang saya suka pernyataan itu.
Penerangan yang lebih terperinci
Anda boleh menggali terus ke dalam kod laman web (sumber terbuka dan anda boleh meneroka seberapa banyak yang anda suka), atau kami boleh membincangkannya lagi.
Adakah anda ingin menggali lebih mendalam dan meneroka pelaksanaan contoh ini? Ok, saya akan menerangkan dengan lebih terperinci:
- Dapatkan data dari pangkalan data untuk menjana setiap halaman
- Terbitkan data ke API pangkalan data menggunakan fungsi tanpa pelayan
- Mencetuskan penjanaan semula tapak lengkap
- Membuat permintaan apabila halaman belum dijana
Menjana halaman dari pangkalan data
Kemudian, kita akan membincangkan cara menerbitkan data ke pangkalan data, tetapi pertama, mari kita anggap ada beberapa penyertaan dalam pangkalan data. Kami akan menjana laman web yang mengandungi halaman untuk setiap entri.
Penjana laman web statik sangat baik dalam hal ini. Mereka memproses data, memohon kepada templat, dan output fail HTML yang sedia untuk disajikan. Kita boleh menggunakan mana -mana penjana untuk contoh ini. Saya memilih sebelas kerana ia agak mudah dan generasi tapak pantas.
Untuk menyediakan sebelas dengan beberapa data, kami mempunyai banyak pilihan. Salah satu cara ialah menyediakan beberapa JavaScript yang mengembalikan data berstruktur. Ini bagus untuk menanyakan API pangkalan data.
Fail data sebanyak sebelas kami akan kelihatan seperti ini:
<code>// 設(shè)置與Fauna 數(shù)據(jù)庫(kù)的連接。 // 使用環(huán)境變量進(jìn)行身份驗(yàn)證// 并訪問(wèn)數(shù)據(jù)庫(kù)。 const faunadb = require('faunadb'); const q = faunadb.query; const client = new faunadb.Client({ secret: process.env.FAUNADB_SERVER_SECRET }); module.exports = () => { return new Promise((resolve, reject) => { // 獲取最新的100,000 個(gè)條目(為了我們的示例) client.query( q.Paginate(q.Match(q.Ref("indexes/all_lollies")),{size:100000}) ).then((response) => { // 獲取每個(gè)條目的所有數(shù)據(jù)const lollies = response.data; const getAllDataQuery = lollies.map((ref) => { return q.Get(ref); }); return client.query(getAllDataQuery).then((ret) => { // 將數(shù)據(jù)發(fā)送回Eleventy 以用于站點(diǎn)構(gòu)建resolve(ret); }); }).catch((error) => { console.log("error", error); reject(error); }); }) }</code>
Saya menamakan fail ini lollies.js dan ia akan membuat semua data yang dikembalikan tersedia untuk sebelas dalam koleksi bernama Lollies.
Kami kini boleh menggunakan data itu dalam templat kami. Jika anda ingin melihat kod yang mengambil data itu dan menghasilkan halaman untuk setiap projek, anda boleh melihatnya dalam repositori kod.
Hantar dan simpan data tanpa pelayan
Apabila kami membuat halaman Lollipop baru, kami perlu menangkap kandungan pengguna ke dalam pangkalan data supaya kami dapat menggunakannya untuk mengisi halaman URL yang diberikan pada masa akan datang. Untuk melakukan ini, kami menggunakan borang HTML tradisional untuk menerbitkan data kepada pengendali bentuk yang sesuai.
Bentuknya kelihatan seperti ini (atau lihat kod penuh dalam repositori):
<code></code>
tidak mempunyai pelayan web dalam skim hosting kami, jadi kami perlu merancang tempat untuk mengendalikan permintaan siaran HTTP yang dikemukakan dari borang ini. Ini adalah kes penggunaan yang sempurna untuk fungsi tanpa pelayan. Saya menggunakan fungsi Netlify untuk ini. Anda boleh menggunakan AWS Lambda, Google Cloud, atau fungsi Azure jika anda lebih suka, tetapi saya suka kesederhanaan aliran kerja Netlify Fungsi, dan fakta bahawa ia menyimpan API tanpa pelayan saya dan UI saya dalam repositori kod yang sama.
Ia adalah kebiasaan yang baik untuk mengelakkan butiran pelaksanaan backend yang bocor ke frontend. Pemisahan yang jelas membantu menjadikan perkara lebih mudah untuk transplantasi dan kemas. Semak sifat tindakan elemen borang di atas. Ia menerbitkan data ke jalan yang dipanggil /baru di laman web saya, yang tidak benar -benar membayangkan perkhidmatan yang akan berkomunikasi dengannya.
Kami boleh mengarahkannya ke mana -mana perkhidmatan yang kami suka menggunakan pengalihan. Saya menghantarnya ke fungsi tanpa pelayan yang saya akan mengkonfigurasi dalam projek ini, tetapi ia boleh disesuaikan dengan mudah untuk menghantar data di tempat lain jika kita mahu. Netlify menyediakan kami dengan enjin pengalihan yang mudah dan sangat dioptimumkan yang mengarahkan trafik kami di peringkat CDN supaya pengguna dapat mengarah ke lokasi yang tepat dengan cepat.
Peraturan redirect berikut (terletak di fail netlify.toml projek saya) proksi Permintaan untuk /baru ke fungsi tanpa pelayan yang dipanggil newlolly.js yang dihoskan oleh fungsi Netlify.
<code># 將“new”URL 解析為函數(shù)[[redirects]] from = "/new" to = "/.netlify/functions/newLolly" status = 200</code>
Mari lihat fungsi tanpa pelayan itu:
- Simpan data baru ke dalam pangkalan data,
- Buat URL baru untuk halaman baru dan
- Pengganti semula pengguna ke halaman yang baru dibuat supaya mereka dapat melihat hasilnya.
Pertama, kita akan memerlukan pelbagai utiliti untuk menghuraikan data borang, menyambung ke pangkalan data Fauna dan membuat ID pendek dan mudah dibaca untuk Lollipop baru.
<code>const faunadb = require('faunadb'); // 用于訪問(wèn)FaunaDB const shortid = require('shortid'); // 生成短唯一URL const querystring = require('querystring'); // 幫助我們解析表單數(shù)據(jù)// 首先,我們使用我們的數(shù)據(jù)庫(kù)設(shè)置一個(gè)新的連接。 // 環(huán)境變量幫助我們安全地連接// 到正確的數(shù)據(jù)庫(kù)。 const q = faunadb.query const client = new faunadb.Client({ secret: process.env.FAUNADB_SERVER_SECRET })</code>
Sekarang, kami akan menambah beberapa kod kepada permintaan untuk mengendalikan fungsi tanpa pelayan. Fungsi pengendali akan menghuraikan permintaan untuk mendapatkan data yang diperlukan dari penyerahan borang, kemudian menghasilkan ID unik untuk lollipop baru, dan kemudian membuatnya ke dalam pangkalan data sebagai rekod baru.
<code>// 處理對(duì)無(wú)服務(wù)器函數(shù)的請(qǐng)求exports.handler = (event, context, callback) => { // 獲取表單數(shù)據(jù)const data = querystring.parse(event.body); // 添加一個(gè)唯一的路徑ID。并記下它- 我們稍后會(huì)將用戶發(fā)送到它c(diǎn)onst uniquePath = shortid.generate(); data.lollyPath = uniquePath; // 組裝準(zhǔn)備發(fā)送到數(shù)據(jù)庫(kù)的數(shù)據(jù)const lolly = { data: data }; // 在fauna db 中創(chuàng)建棒棒糖條目client.query(q.Create(q.Ref('classes/lollies'), lolly)) .then((response) => { // 成功!將用戶重定向到此新棒棒糖頁(yè)面的唯一URL return callback(null, { statusCode: 302, headers: { Location: `/lolly/${uniquePath}`, } }); }).catch((error) => { console.log('error', error); // 錯(cuò)誤!返回帶有statusCode 400 的錯(cuò)誤return callback(null, { statusCode: 400, body: JSON.stringify(error) }); }); }</code>
Mari kita periksa kemajuan kita. Kami mempunyai cara untuk membuat halaman Lollipop baru dalam pangkalan data. Kami juga mempunyai binaan automatik yang menghasilkan halaman untuk setiap lollipop kami.
Untuk memastikan bahawa terdapat satu set lengkap halaman yang telah dijana untuk setiap lollipop, kita harus mencetuskan membina semula setiap kali entri baru berjaya ditambah ke pangkalan data. Ini sangat mudah dilakukan. Terima kasih kepada penjana laman web statik kami, binaan kami telah automatik. Kami hanya memerlukan satu cara untuk mencetuskannya. Dengan Netlify, kita boleh menentukan bilangan cangkuk membina. Mereka adalah webhooks dan jika mereka menerima permintaan pos HTTP, mereka akan membina semula dan menggunakan laman web kami. Ini adalah yang saya buat dalam konsol pengurusan tapak Netlify:
Untuk menjana semula laman web ini, termasuk halaman setiap lollipop yang direkodkan dalam pangkalan data, kami boleh mengeluarkan permintaan pos HTTP ke cangkuk membina ini dengan segera selepas menyimpan data baru ke pangkalan data.
Inilah kod yang melakukan ini:
<code>const axios = require('axios'); // 簡(jiǎn)化發(fā)出HTTP POST 請(qǐng)求// 觸發(fā)新的構(gòu)建以永久凍結(jié)此棒棒糖axios.post('https://api.netlify.com/build_hooks/5d46fa20da4a1b70XXXXXXXXX') .then(function (response) { // 在無(wú)服務(wù)器函數(shù)的日志中報(bào)告console.log(response); }) .catch(function (error) { // 描述無(wú)服務(wù)器函數(shù)日志中的任何錯(cuò)誤console.log(error); });</code>
Anda dapat melihatnya dalam kod penuh, yang telah ditambah kepada pengendali yang berjaya untuk penyisipan pangkalan data.
Ini semua baik jika kita sanggup menunggu binaan dan penempatan selesai sebelum kita berkongsi URL lollipop baru dengan penerima. Tetapi kami tidak sabar dan kami segera ingin berkongsi apabila kami mendapat URL baru untuk lollipop yang baru saja kami buat.
Malangnya, jika kami mengakses URL sebelum tapak melengkapkan penjanaan semula untuk memasukkan halaman baru, kami akan mendapat 404. Tetapi ia adalah keseronokan untuk mengambil kesempatan daripada 404 ini.
Routing URL Optimis dan senario back-up tanpa pelayan
Menggunakan penghalaan 404 adat, kami mempunyai pilihan untuk menghantar setiap permintaan gagal ke halaman Lollipop ke halaman yang boleh terus mencari data lollipop dalam pangkalan data. Kita boleh melakukan ini dalam klien JavaScript jika kita mahu, tetapi cara yang lebih baik adalah secara dinamik menghasilkan halaman yang sedia untuk dilihat dari fungsi tanpa pelayan.
Kaedahnya adalah seperti berikut:
Pertama, kita perlu memberitahu semua permintaan yang ingin mengakses halaman Lollipop (permintaan ini kembali kosong) untuk pergi ke fungsi tanpa pelayan kami. Kami melakukan ini dengan menambahkan peraturan lain ke konfigurasi redirect Netlify:
<code># 未找到的棒棒糖應(yīng)該直接代理到API [[redirects]] from = "/lolly/*" to = "/.netlify/functions/showLolly?id=:splat" status = 302</code>
Peraturan ini hanya digunakan jika permintaan untuk halaman Lollipop tidak menemui halaman statik yang sedia untuk disampaikan. Ia mewujudkan redirect sementara (HTTP 302) ke fungsi tanpa pelayan kami, yang kelihatan seperti ini:
<code>const faunadb = require('faunadb'); // 用于訪問(wèn)FaunaDB const pageTemplate = require('./lollyTemplate.js'); // JS 模板文字// 設(shè)置和授權(quán)Fauna DB 客戶端const q = faunadb.query; const client = new faunadb.Client({ secret: process.env.FAUNADB_SERVER_SECRET }); exports.handler = (event, context, callback) => { // 從請(qǐng)求中獲取棒棒糖ID const path = event.queryStringParameters.id.replace("/", ""); // 在DB 中查找棒棒糖數(shù)據(jù)client.query( q.Get(q.Match(q.Index("lolly_by_path"), path)) ).then((response) => { // 如果找到,則返回視圖return callback(null, { statusCode: 200, body: pageTemplate(response.data) }); }).catch((error) => { // 未找到或發(fā)生錯(cuò)誤,將悲傷的用戶發(fā)送到通用錯(cuò)誤頁(yè)面console.log('Error:', error); return callback(null, { body: JSON.stringify(error), statusCode: 301, headers: { Location: `/melted/index.html`, } }); }); }</code>
Jika permintaan untuk mana -mana halaman lain (tidak di dalam / lolly / laluan tapak) mengembalikan 404, kami tidak akan menghantar permintaan itu ke fungsi tanpa pelayan kami untuk memeriksa lollipops. Kami boleh menghantar pengguna terus ke halaman 404. Konfigurasi Netlify.toml kami membolehkan kami menentukan bilangan 404 tahap penghalaan dengan menambahkan lebih banyak peraturan sandaran ke fail. Perlawanan pertama yang berjaya dalam fail akan diterima pakai.
<code># 未找到的棒棒糖應(yīng)該直接代理到API [[redirects]] from = "/lolly/*" to = "/.netlify/functions/showLolly?id=:splat" status = 302 # 真正的404 可以直接轉(zhuǎn)到這里: [[redirects]] from = "/*" to = "/melted/index.html" status = 404</code>
Kami sudah selesai! Kami kini mempunyai laman "statik pertama" yang akan cuba menjadikan kandungan secara dinamik menggunakan fungsi tanpa pelayan jika URL belum dijana dengan fail statik.
Sangat pantas!
Menyokong skala yang lebih besar
Teknik mencetuskan binaan untuk menjana semula halaman lollipop setiap kali entri baru dicipta mungkin tidak selalu menjadi yang terbaik. Walaupun automasi binaan bermakna penempatan semula laman web sangat mudah, kita mungkin mahu mula mengehadkan dan mengoptimumkan perkara apabila kita mula menjadi sangat popular. (Ini hanya masalah masa, bukan?)
Tidak menjadi masalah. Berikut adalah beberapa perkara yang perlu dipertimbangkan ketika kami membuat banyak halaman dan menambah kandungan lebih kerap dalam pangkalan data:
- Daripada mencetuskan pembinaan semula untuk setiap entri baru, kami dapat membina semula tapak tersebut menjadi pekerjaan yang dijadualkan. Mungkin ini boleh berlaku setiap jam atau sekali sehari.
- Jika dibina sekali sehari, kami boleh membuat keputusan untuk menjana halaman hanya untuk lollipop baru yang dikemukakan pada hari lalu dan cache halaman yang dihasilkan setiap hari untuk kegunaan masa depan. Logik ini dalam binaan akan membantu kami menyokong sejumlah besar halaman lollipop tanpa membuat binaan terlalu lama. Tetapi saya tidak akan bercakap mengenai cache di sini. Jika anda ingin tahu, anda boleh bertanya di Forum Komuniti Netlify.
Dengan menggabungkan sumber pra-dihasilkan statik dengan penyelesaian back-up tanpa pelayan yang menyediakan rendering dinamik, kami dapat memenuhi pelbagai kes penggunaan yang sangat luas-sambil mengelakkan keperluan untuk mengkonfigurasi dan mengekalkan sejumlah besar infrastruktur dinamik.
Apakah kes penggunaan lain yang boleh anda gunakan pendekatan "statik pertama" ini untuk bertemu?
Atas ialah kandungan terperinci Statik Pertama: Laman Jamstack Pra-Dihasilkan dengan Rendering Tanpa Pelayan sebagai sandaran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Terdapat tiga cara untuk membuat pemutar pemuatan CSS: 1. Gunakan pemutar asas sempadan untuk mencapai animasi mudah melalui HTML dan CSS; 2. Gunakan pemutar tersuai pelbagai mata untuk mencapai kesan lompat melalui masa kelewatan yang berlainan; 3. Tambahkan pemutar dalam butang dan beralih kelas melalui JavaScript untuk memaparkan status pemuatan. Setiap pendekatan menekankan pentingnya butiran reka bentuk seperti warna, saiz, kebolehcapaian dan pengoptimuman prestasi untuk meningkatkan pengalaman pengguna.

Untuk menangani keserasian pelayar CSS dan isu awalan, anda perlu memahami perbezaan sokongan penyemak imbas dan menggunakan awalan vendor dengan munasabah. 1. Memahami masalah biasa seperti Flexbox dan sokongan grid, kedudukan: prestasi tidak sah, dan prestasi animasi adalah berbeza; 2. Periksa status sokongan ciri CANIUSE Ciri; 3. Gunakan dengan betul -webkit-, -moz-, -ms-, -o- dan awalan pengeluar lain; 4. Adalah disyorkan untuk menggunakan autoprefixer untuk menambah awalan secara automatik; 5. Pasang postcss dan konfigurasi penyemak imbas untuk menentukan penyemak imbas sasaran; 6. Secara automatik mengendalikan keserasian semasa pembinaan; 7. Ciri -ciri pengesanan moden boleh digunakan untuk projek lama; 8. Tidak perlu meneruskan konsistensi semua pelayar,

Gunakan atribut clip-path CSS untuk menanam unsur-unsur ke dalam bentuk tersuai, seperti segitiga, takik bulat, poligon, dan lain-lain, tanpa bergantung pada gambar atau SVG. Kelebihannya termasuk: 1. Menyokong pelbagai bentuk asas seperti Circle, Ellipse, Polygon, dan lain -lain; 2. Pelarasan responsif dan boleh disesuaikan dengan terminal mudah alih; 3. Mudah untuk animasi, dan boleh digabungkan dengan hover atau javascript untuk mencapai kesan dinamik; 4. Ia tidak menjejaskan aliran susun atur, dan hanya tanaman kawasan paparan. Penggunaan umum adalah seperti laluan klip bulat: bulatan (50pxatcenter) dan triangle clip-path: polygon (50%0%, 100 0%, 0 0%). Notis

Themaindifferencesbetweendisplay: inline, block, andinline-blockinhtml/cssarelayoutbehavior, spaceusage, andstylingcontrol.1.inlineelementsflowwithtext, notstartonNewlines, abaikanwidth/height, andonyapplylylylylylinddding/

Menetapkan gaya pautan yang telah anda lawati dapat meningkatkan pengalaman pengguna, terutama di laman web yang berintensifkan kandungan untuk membantu pengguna menavigasi lebih baik. 1. Gunakan CSS: Kelas pseudo yang dilawati untuk menentukan gaya pautan yang dikunjungi, seperti perubahan warna; 2. Perhatikan bahawa penyemak imbas hanya membenarkan pengubahsuaian beberapa atribut disebabkan oleh sekatan privasi; 3. Pemilihan warna harus diselaraskan dengan gaya keseluruhan untuk mengelakkan ketangkasan; 4. Terminal mudah alih mungkin tidak memaparkan kesan ini, dan disyorkan untuk menggabungkannya dengan arahan visual lain seperti logo tambahan ikon.

Untuk membuat imej responsif menggunakan CSS, ia boleh dicapai terutamanya melalui kaedah berikut: 1. Gunakan maksimum lebar: 100% dan ketinggian: auto untuk membolehkan imej menyesuaikan diri dengan lebar kontena sambil mengekalkan perkadaran; 2. Gunakan atribut SRCSET dan saiz HTML dengan bijak memuatkan sumber imej yang disesuaikan dengan skrin yang berbeza; 3. Gunakan objek-sesuai dan kedudukan objek untuk mengawal penanaman imej dan paparan fokus. Bersama -sama, kaedah ini memastikan bahawa imej dibentangkan dengan jelas dan indah pada peranti yang berbeza.

Pilihan unit CSS bergantung kepada keperluan reka bentuk dan keperluan responsif. 1.PX digunakan untuk saiz tetap, sesuai untuk kawalan yang tepat tetapi kekurangan keanjalan; 2.EM adalah unit relatif, yang mudah disebabkan oleh pengaruh unsur induk, sementara REM lebih stabil berdasarkan unsur akar dan sesuai untuk skala global; 3.VW/VH didasarkan pada saiz viewport, sesuai untuk reka bentuk yang responsif, tetapi perhatian harus dibayar kepada prestasi di bawah skrin yang melampau; 4. Apabila memilih, ia harus ditentukan berdasarkan sama ada pelarasan responsif, hubungan hierarki elemen dan ketergantungan viewport. Penggunaan yang munasabah boleh meningkatkan fleksibiliti dan penyelenggaraan susun atur.

Penyemak imbas yang berbeza mempunyai perbezaan dalam parsing CSS, mengakibatkan kesan paparan yang tidak konsisten, terutamanya termasuk perbezaan gaya lalai, kaedah pengiraan model kotak, flexbox dan tahap sokongan susun atur grid, dan tingkah laku yang tidak konsisten bagi atribut CSS tertentu. 1. Pemprosesan gaya lalai tidak konsisten. Penyelesaiannya adalah menggunakan cssreset atau normalisasi.css untuk menyatukan gaya awal; 2. Kaedah pengiraan model kotak versi lama IE adalah berbeza. Adalah disyorkan untuk menggunakan kotak-kotak: kotak sempadan dengan cara yang bersatu; 3. Flexbox dan grid melakukan secara berbeza dalam kes kelebihan atau dalam versi lama. Lebih banyak ujian dan gunakan autoprefixer; 4. Beberapa tingkah laku atribut CSS tidak konsisten. CANIUSE mesti dirujuk dan diturunkan.
