国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
什么是Express?
了解Express中的中間件
源代碼
步驟2。配置
步驟3。創(chuàng)建一個(gè)測(cè)試框架
4。設(shè)置一個(gè)帶有Express的MVC模式
步驟1。模型
5。創(chuàng)建FastDelivery網(wǎng)站
步驟1??刂泼姘?/a>
保護(hù)管理面板
步驟3。前端
結(jié)論
首頁 web前端 js教程 使用Express建立一個(gè)完整的MVC網(wǎng)站

使用Express建立一個(gè)完整的MVC網(wǎng)站

Mar 14, 2025 am 09:33 AM


什么是Express?

Express是Node.js的最佳框架之一。它具有大力的支持和許多有用的功能。那里有很多很棒的文章,涵蓋了所有基礎(chǔ)知識(shí)。但是,這次我想深入研究,并分享我的工作流程以創(chuàng)建一個(gè)完整的網(wǎng)站。通常,本文不僅用于Express,而且還將其與其他一些可用于節(jié)點(diǎn)開發(fā)人員使用的優(yōu)質(zhì)工具結(jié)合使用。

要遵循本教程,我假設(shè)您對(duì)節(jié)點(diǎn)有些熟悉,并且已將其安裝在系統(tǒng)上。

了解Express中的中間件

Express的核心是連接。這是一個(gè)中間件框架,配備了許多有用的東西。如果您想知道什么是中間件,這是一個(gè)快速示例:

 const connect = require('connect'),<br> http = require('http');<br><br> const app = connect()<br> .use(function(req,res,ext)<br> console.log(“那是我的第一個(gè)中間件”);<br> 下一個(gè)();<br> }))<br> .use(function(req,res,ext)<br> console.log(“那是我的第二個(gè)中間件”);<br> 下一個(gè)();<br> }))<br> .use(function(req,res,ext)<br> console.log(“ end”);<br> res.end(“ Hello World”);<br> });<br><br> http.Createserver(App).Listen(3000);<br>

中間件基本上是一個(gè)函數(shù),該函數(shù)接受響應(yīng)對(duì)象和響應(yīng)對(duì)象,或通過在第二個(gè)中間件中調(diào)用Next()方法來調(diào)用下一個(gè)函數(shù),Body Parser解析請(qǐng)求主體并支持應(yīng)用程序/JSON,Application/X-WWW-Form-urlCormeded,以及Multipart/form-data。并用cookie名稱鍵入的對(duì)象進(jìn)行req.cookies。

Express Craps實(shí)際上連接并添加了一些新功能,例如路由邏輯,這使得該過程更加順暢。這是處理Express中的GET請(qǐng)求的示例:

 app.get('/hello.txt',function(req,res){<br> var body ='Hello world';<br> res.setheader('content-type','text/plain');<br> res.setheader(“內(nèi)容長度”,body.mength);<br> res.end(身體);<br> });<br>

源代碼

我們構(gòu)建的示例網(wǎng)站的源代碼可在GitHub上使用。請(qǐng)隨意分叉并與之一起玩。這是運(yùn)行網(wǎng)站的步驟。

  • 下載源代碼
  • 轉(zhuǎn)到NPM安裝
  • 運(yùn)行MongoDB守護(hù)程序
  • 運(yùn)行NPM安裝。
     {<br> “名稱”:“ mywebsite”,<br> “描述”:“我的網(wǎng)站”,<br> “版本”:“ 0.0.1”,<br> “依賴關(guān)系”:{<br> “ express”:“ 5.x”<br> }<br> }<br>

    框架的代碼將放置在node_modules中,您將能夠創(chuàng)建一個(gè)實(shí)例。但是,我更喜歡使用命令行工具一個(gè)替代選項(xiàng)。通過使用NPX Express-Generator命令:

     用法:Express [選項(xiàng)] [DIR]<br><br> 選項(xiàng):<br><br>  -  version輸出版本號(hào)<br> -e,-ej添加EJS引擎支持<br>  -  Pug添加哈哈發(fā)動(dòng)機(jī)支撐<br> -HBS添加車把引擎支持<br> -h, - 霍根添加hogan.js引擎支持<br> -v,-view <engine>添加視圖<engine>支持(灰塵|<br>  - 不使用靜態(tài)HTML代替視圖引擎<br> -c,-css <egene>添加樣式表<engine> support> support> sandlus | Compass | sass)(默認(rèn)為普通CSS)<br>  -  git添加.gitignore<br> -F, - 非空目錄的力量<br> -h, - 螺旋輸出使用信息<br></engine></egene></engine></engine>

    如您所見,只有一些可用的選擇,但是對(duì)我來說,它們已經(jīng)足夠了。通常,我少用作為CSS預(yù)處理器和車把作為模板引擎。在此示例中,我們還需要會(huì)話支持,因此NPM安裝和NODE_MODULES文件夾將彈出。

    我意識(shí)到上述方法并不總是合適的。您可能需要將路線處理程序放置在另一個(gè)目錄或類似目錄中。但是,正如您將在接下來的幾節(jié)中看到的那樣,我將對(duì)已經(jīng)生成的結(jié)構(gòu)進(jìn)行更改,并且很容易做到。因此,您應(yīng)該只是想到app.js來使用我們的新文件結(jié)構(gòu)。我們需要?jiǎng)h除這兩行:

     const usersrouter = require(“ ./路由/用戶”);<br> ...<br> app.use(“/用戶”,usersrouter);<br>

    步驟2。配置

    現(xiàn)在,我們需要設(shè)置配置。讓我們想象我們的小網(wǎng)站應(yīng)部署到三個(gè)不同的位置:本地服務(wù)器,登臺(tái)服務(wù)器和生產(chǎn)服務(wù)器。當(dāng)然,每個(gè)環(huán)境的設(shè)置都不同,我們應(yīng)該實(shí)施一種足夠靈活的機(jī)制。如您所知,每個(gè)節(jié)點(diǎn)腳本都是作為控制臺(tái)程序運(yùn)行的。因此,我們可以輕松地發(fā)送將定義當(dāng)前環(huán)境的命令行參數(shù)。我將該部分包裹在單獨(dú)的模塊中,以便稍后為其編寫測(cè)試。這是/config/index.js文件:

     const config = {<br> 當(dāng)?shù)氐模?{<br> 模式:“本地”,<br> 端口:3000<br> },,<br> 登臺(tái):{<br> 模式:“分期”,<br> 端口:4000<br> },,<br> 生產(chǎn): {<br> 模式:“生產(chǎn)”,<br> 端口:5000<br> }<br> }<br> Module.exports = function(mode){<br> 返回配置[模式|| process.argv [2] || 'local'] || config.local;<br> }<br>

    (現(xiàn)在)只有兩個(gè)設(shè)置:端口。您可能已經(jīng)猜到了,該應(yīng)用程序?yàn)椴煌姆?wù)器使用不同的端口。這就是為什么我們必須在app.js中更新站點(diǎn)的輸入點(diǎn)的原因。

     const config = require('./ config')();<br> process.env.port = config.port;<br>

    要在配置之間切換,只需在末尾添加環(huán)境即可。例如:

     NPM開始登臺(tái)<br>

    將在端口4000運(yùn)行服務(wù)器。

    現(xiàn)在,我們將所有設(shè)置都放在一個(gè)地方,并且很容易管理。


    步驟3。創(chuàng)建一個(gè)測(cè)試框架

    我是測(cè)試驅(qū)動(dòng)開發(fā)(TDD)的忠實(shí)擁護(hù)者。我將嘗試介紹本文中使用的所有基礎(chǔ)類。當(dāng)然,對(duì)所有內(nèi)容進(jìn)行測(cè)試都會(huì)使這本書的寫作太長,但是總的來說,這就是創(chuàng)建自己的應(yīng)用程序時(shí)應(yīng)該繼續(xù)進(jìn)行的方式。我最喜歡的測(cè)試框架之一是UVU,因?yàn)樗浅R子谑褂煤涂焖偈褂谩.?dāng)然,它可以在NPM注冊(cè)表中使用:

     npm安裝 -  save-dev uvu<br>

    然后,在NPM測(cè)試中創(chuàng)建一個(gè)新腳本,您應(yīng)該看到以下內(nèi)容:

     config.js<br> ???(3/3)<br><br> 總計(jì):3<br> 通過:3<br> 跳過:0<br> 持續(xù)時(shí)間:0.81ms<br>

    這次,我首先編寫了實(shí)施,第二個(gè)測(cè)試。這并不是TDD做事的方式,而是在接下來的幾個(gè)部分中,我將相反。

    我強(qiáng)烈建議您花費(fèi)大量時(shí)間寫作測(cè)試。沒有什么比全面測(cè)試的應(yīng)用程序更好的了。

    幾年前,我意識(shí)到一些非常重要的事情,這可能有助于您制作更好的程序。每次您開始編寫新課程,新模塊或僅僅是新邏輯時(shí),請(qǐng)問自己:

    我該如何測(cè)試?

    這個(gè)問題的答案將有助于您更有效地編碼,創(chuàng)建更好的API,并將所有內(nèi)容放入良好的塊中。您不能為意大利面代碼編寫測(cè)試。例如,在上面的配置文件( /config/index.js )中,我添加了發(fā)送生產(chǎn)配置的可能性,但是節(jié)點(diǎn)腳本是使用NPM安裝MongoDB運(yùn)行的。

    接下來,我們將編寫一個(gè)測(cè)試,該測(cè)試檢查是否運(yùn)行了MongoDB服務(wù)器。這是/tests/mongodb.js文件:

     const {test} = require(“ uvu”);<br> const {mongoclient} = require(“ mongodb”);<br><br> test(“ mongodb服務(wù)器活動(dòng)”,async函數(shù)(){<br> const client = new mongoclient(“ mongodb://127.0.0.1:27017/fastdelivery”);<br> 等待client.connect();<br> });<br><br> test.run();<br><br>

    我們不需要添加MongoDB客戶端的任何連接方法,每當(dāng)我們必須向數(shù)據(jù)庫提出請(qǐng)求時(shí),都會(huì)接收一個(gè)mongoclient對(duì)象。因此,我們應(yīng)該連接到初始服務(wù)器創(chuàng)建中的數(shù)據(jù)庫。為此,由于中間件在每個(gè)請(qǐng)求之前自動(dòng)運(yùn)行,因此在Req.db屬性中可用。


    4。設(shè)置一個(gè)帶有Express的MVC模式

    我們都知道MVC模式。問題是如何適用表達(dá)?;蚨嗷蛏?,這是解釋的問題。在接下來的幾個(gè)步驟中,我將創(chuàng)建模塊,該模塊充當(dāng)模型,視圖和控制器。

    步驟1。模型

    該模型將是處理我們應(yīng)用程序中的數(shù)據(jù)的方法。它應(yīng)該可以使用雜種。我們的模型還應(yīng)該有一種擴(kuò)展它的方法,因?yàn)槲覀兛赡苄枰獎(jiǎng)?chuàng)建不同類型的模型。例如,我們可能想要一個(gè)contactsmodel。因此,我們需要編寫一個(gè)新規(guī)格, /tests /base.model.js ,以測(cè)試這兩個(gè)模型功能。并記住,通過在開始編碼實(shí)現(xiàn)之前定義這些功能,我們可以保證我們的模塊只能完成我們想要的工作。

     const {test} = require(“ uvu”);<br> const sustert = require(“ uvu/servert”);<br> const ModelClass = require(“ ../ models/base”);<br> const dbmockup = {};<br> test(“模塊創(chuàng)建”,異步函數(shù)(){<br> const Model =新的ModelClass(DBMOCKUP);<br> assert.ok(model.db);<br> assert.ok(model.setdb);<br> assert.ok(model.Collection);<br> });<br> test.run();<br>

    而不是真實(shí)的DB對(duì)象和我們的數(shù)據(jù)庫視圖目錄的Getter將更改為基本視圖類?,F(xiàn)在,這個(gè)小的更改需要另一個(gè)更改。我們應(yīng)該通知明確說明我們的模板文件現(xiàn)在放置在另一個(gè)目錄中:

     app.set(“ views”,path.join(__ dirname,“模板”));<br>

    首先,我將定義我需要的內(nèi)容,編寫測(cè)試,然后編寫實(shí)現(xiàn)。我們需要一個(gè)匹配以下規(guī)則的模塊:

    • 它的構(gòu)造函數(shù)應(yīng)接收響應(yīng)對(duì)象和模板名稱。
    • 它應(yīng)該有一個(gè)視圖類。難道不僅以某種方式調(diào)用響應(yīng)對(duì)象,例如,提供JSON數(shù)據(jù):
       const data = {開發(fā)人員:“ krasimir tsonev”};<br> response.conttype(“ application/json”);<br>響應(yīng)send(json.stringify(data));<br>

      擁有JSONVIEW類,甚至是測(cè)試目錄,而不是每次都這樣做,如果您在路線之后運(yùn)行'/'(在上面的示例中,實(shí)際上是控制器)是一個(gè)接受響應(yīng)的函數(shù),并且是一個(gè)接受響應(yīng)的函數(shù),并且Express(1)命令行工具將是一個(gè)名為“舊界限”功能,它是舊的Middledware函數(shù),它是舊的Middledware函數(shù),它是一個(gè)舊的Middledware函數(shù),它是optres ofer

    • 應(yīng)該有一種運(yùn)行方法以及其自己的邏輯。

      5。創(chuàng)建FastDelivery網(wǎng)站

      好的,我們?yōu)镸VC體系結(jié)構(gòu)提供了一系列的課程,并且我們已經(jīng)通過測(cè)試介紹了新創(chuàng)建的模塊。現(xiàn)在,我們準(zhǔn)備繼續(xù)使用假公司FastDelivery的網(wǎng)站。

      讓我們想象該站點(diǎn)有兩個(gè)部分:前端和管理面板。前端將用于向我們的最終用戶顯示數(shù)據(jù)庫中寫的信息。管理面板將用于管理該數(shù)據(jù)。讓我們從管理員(控制)面板開始。

      步驟1。控制面板

      讓我們首先創(chuàng)建一個(gè)簡單的控制器,該控制器將用作管理頁面。這是/routes/admin.js文件:

       const basecontroller = require(“ ./ base”),<br> view = require(“ ../ view/base”);<br> Module.exports = new(class adminController擴(kuò)展了basecontroller {<br> constructor(){<br> 超級(jí)(“ admin”);<br> }<br> 運(yùn)行(req,res,next){<br> if(this.authorize(req)){<br> req.session.fastDelivery = true;<br> req.session.save(function(err){<br> var v =新視圖(res,“ admin”);<br> v.render({<br> 標(biāo)題:“管理”,<br> 內(nèi)容:“歡迎來到控制面板”,<br> });<br> });<br> } 別的 {<br> const v =新視圖(res,“ admin-login”);<br> v.render({<br> 標(biāo)題:“請(qǐng)登錄”,<br> });<br> }<br> }<br> 授權(quán)(req){<br> 返回 (<br> (Req.Session &&<br> req.session.fastDelivery &&<br> req.session.fastDelivery === true)||<br> (req.body &&<br> req.body.username === this.username && &&<br> req.body.password === this.password)<br> );<br> }<br> })();<br>

      通過為控制器和視圖使用預(yù)編寫的基本類,我們可以輕松地為控制面板創(chuàng)建入口點(diǎn)。 admin.run方法直接作為中間件。那是因?yàn)槲覀兿氡A羯舷挛?。如果我們這樣做:

       app.all('/admin*',admin.run);<br>

      admin一詞將指向其他內(nèi)容。

      保護(hù)管理面板

      /管理為開頭的每個(gè)頁面都應(yīng)受到保護(hù)。為了實(shí)現(xiàn)這一目標(biāo),我們將使用Express的中間件:Session。它只需將對(duì)象附加到稱為admin Controller的請(qǐng)求即可做兩個(gè)其他事情:

      • 它應(yīng)該檢查是否有可用的會(huì)話。如果沒有,請(qǐng)顯示登錄表單。
      • 如果用戶名和密碼匹配,則應(yīng)接受登錄表格發(fā)送的數(shù)據(jù)并授權(quán)用戶。

      這是我們可以用來實(shí)現(xiàn)這一目標(biāo)的小輔助功能:

      授權(quán)(req){<br> 返回 (<br> (Req.Session &&<br> req.session.fastDelivery &&<br> req.session.fastDelivery === true)||<br> (req.body &&<br> req.body.username === this.username && &&<br> req.body.password === this.password)<br> );<br> }<br>

      首先,我們有一個(gè)聲明,試圖通過會(huì)話對(duì)象識(shí)別用戶。其次,我們檢查是否已提交表格。如果是這樣,則來自表單的數(shù)據(jù)在BodyParser中間件中可用。然后,我們只檢查用戶名和密碼是否匹配。

      現(xiàn)在,這是標(biāo)題,圖片和類型屬性將確定記錄的所有者。例如,“聯(lián)系人”頁面只需要一個(gè)使用Admin Controller的記錄。為了簡化任務(wù),我決定將添加記錄列表和添加/編輯的表格組合起來。如您在下面的屏幕截圖中看到的那樣,該頁面的左側(cè)為列表保留,并保留該表單的右側(cè)部分。

      使用Express建立一個(gè)完整的MVC網(wǎng)站

      在一個(gè)頁面上擁有所有內(nèi)容意味著我們必須集中精力在呈現(xiàn)頁面的部分,或更具體地說,是我們發(fā)送到模板的數(shù)據(jù)。這就是為什么我創(chuàng)建了幾個(gè)合并的助手功能,例如:

       this.del(req,function(){<br> this.form(req,res,function(formmarkup){<br> this.list(function(listmarkup){<br> v.render({<br> 標(biāo)題:“管理”,<br> 內(nèi)容:“歡迎來到控制面板”,<br> 列表:Listmarkup,<br> 表格:formmarkup,<br> });<br> });<br> });<br> });<br> const v =新視圖(res,“ admin”);<br>

      它看起來有些丑陋,但它可以按照我的意愿起作用。第一個(gè)助手是一個(gè)操作= delete&id = [記錄的ID],它從集合中刪除了數(shù)據(jù)。第二個(gè)功能稱為列表方法獲取信息并準(zhǔn)備HTML表,后來將其發(fā)送到模板??梢栽诒窘坛痰脑创a中找到這三個(gè)幫助者的實(shí)現(xiàn)。

      在這里,我決定向您展示處理admin.js中的文件上傳的功能:

       handerfileupload(req){<br> 如果(!<br> 返回req.body.currentPicture || “”<br> }<br> const data = fs.ReadFileSync(req.files.picture.path);<br> const filename = req.files.picture.name;<br> const uid = crypto.randombytes(10).tostring(“ hex”);<br> const dir = __dirname“ /../public/uploads/” uid;<br> fs.mkdirsync(dir,“ 0777”);<br> fs.WriteFileSync(dir“/”文件名,數(shù)據(jù));<br> 返回“/uploads/“ uid”/“ fileName;<br> }<br>

      如果提交文件,則節(jié)點(diǎn)腳本req.files.picture。在上面的代碼段中,readfilesync,writefilesync。

      步驟3。前端

      艱苦的工作現(xiàn)在已經(jīng)完成。管理面板正在工作,我們有一個(gè)家庭和四個(gè)記錄,其中包含博客的DB對(duì)象,但請(qǐng)致電“不同 /blog /:id string”。該路線將匹配req.params.id等URL。換句話說,我們能夠定義動(dòng)態(tài)參數(shù)。在我們的情況下,這就是記錄的ID。獲得此信息后,我們可以為每篇文章創(chuàng)建一個(gè)唯一的頁面。

      第二個(gè)有趣的部分是我如何構(gòu)建服務(wù),職業(yè)和聯(lián)系人頁面。顯然,他們僅使用數(shù)據(jù)庫中的一個(gè)記錄。如果我們必須為每個(gè)頁面創(chuàng)建一個(gè)不同的控制器,那么我們必須復(fù)制/粘貼相同的代碼,只需在其NPM安裝命令中更改類型即可運(yùn)行以安裝新的依賴項(xiàng)(如果有)。

    • 然后應(yīng)再次運(yùn)行主腳本。
    • 請(qǐng)記住,節(jié)點(diǎn)仍然還很年輕,因此并非所有內(nèi)容都可以按照您的預(yù)期工作,但是一直都有改進(jìn)。例如,永遠(yuǎn)保證您的node.js程序?qū)⑦B續(xù)運(yùn)行。您可以通過發(fā)出以下命令來執(zhí)行此操作:

    永遠(yuǎn)啟動(dòng)您的app.js<br>

    這也是我在服務(wù)器上使用的內(nèi)容。這是一個(gè)不錯(cuò)的小工具,但它解決了一個(gè)大問題。如果您使用永遠(yuǎn)的應(yīng)用程序運(yùn)行,請(qǐng)簡單地重新啟動(dòng)應(yīng)用程序。

    現(xiàn)在我不是系統(tǒng)管理員,但是我想分享我的經(jīng)驗(yàn)將節(jié)點(diǎn)應(yīng)用與Apache或Nginx集成,因?yàn)槲艺J(rèn)為這是開發(fā)工作流程的一部分。

    如您所知,Apache通常在端口80上運(yùn)行,這意味著,如果您打開http:// localhost:80,您將看到Apache Server提供的頁面,并且很可能您的節(jié)點(diǎn)腳本在其他端口上收聽。因此,您需要添加一個(gè)接受請(qǐng)求并將其發(fā)送到正確端口的虛擬主機(jī)。例如,假設(shè)我想托管我們剛剛在主機(jī)文件下的本地Apache服務(wù)器上構(gòu)建的網(wǎng)站。

     127.0.0.1 ExpressCompletewebsite.dev<br>

    之后,我們必須在Apache Configuration目錄下編輯HTTPD-VHOSTS.CONF文件,然后添加:

     #ExpressCompleteWebsite.dev<br> <virtualhost><br> Servername ExprexPleteWebsite.dev<br> Serveralias www.expresscompletewebsite.dev<br> proxyrequest off<br> <br> 訂單拒絕,允許<br> 從所有人那里允許<br> <br> <br> proxypass http:// localhost:3000/<br> ProxypassReverse http:// localhost:3000/<br> <br> </virtualhost><br>

    服務(wù)器仍然接受端口80上的請(qǐng)求,但將其轉(zhuǎn)發(fā)到端口3000,該端口正在偵聽。

    NGINX設(shè)置要容易得多,而且,老實(shí)說,它是托管基于node.js的應(yīng)用程序的更好選擇。您仍然必須在主機(jī)文件中添加域名。之后,只需在NGINX安裝下的/啟用 /站點(diǎn)的目錄中創(chuàng)建一個(gè)新文件即可。文件的內(nèi)容看起來像這樣:

    服務(wù)器 {<br> 聽80;<br> server_name ExpressCompletewebsite.dev<br> 地點(diǎn) / {<br> Proxy_pass http://127.0.0.1:3000;<br> proxy_set_header主機(jī)$ http_host;<br> }<br> }<br>

    請(qǐng)記住,您不能使用上述主機(jī)設(shè)置同時(shí)運(yùn)行Apache和Nginx。那是因?yàn)樗鼈兌夹枰丝?0。此外,如果您計(jì)劃在生產(chǎn)環(huán)境中使用上述代碼段,則可能需要對(duì)更好的服務(wù)器配置進(jìn)行一些其他研究。正如我所說,我不是這個(gè)領(lǐng)域的專家。


    結(jié)論

    Express是一個(gè)很棒的框架,它為您提供了開始構(gòu)建應(yīng)用程序的良好起點(diǎn)。如您所見,這是您將如何擴(kuò)展它以及與之構(gòu)建的方法的選擇。它通過使用一些出色的中間件來簡化無聊的任務(wù),并將有趣的零件留給開發(fā)人員。

    雅各布·杰克遜(Jacob Jackson)的貢獻(xiàn)已更新。雅各布(Jacob)是網(wǎng)絡(luò)開發(fā)人員,技術(shù)作家,自由職業(yè)者和開源貢獻(xiàn)者。

以上是使用Express建立一個(gè)完整的MVC網(wǎng)站的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語言,各自適用于不同的應(yīng)用場景。Java用于大型企業(yè)和移動(dòng)應(yīng)用開發(fā),而JavaScript主要用于網(wǎng)頁開發(fā)。

JavaScript評(píng)論:簡短說明 JavaScript評(píng)論:簡短說明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫;4.處理時(shí)區(qū)問題建議使用支持時(shí)區(qū)的庫,如Luxon。掌握這些要點(diǎn)能有效避免常見錯(cuò)誤。

為什么要將標(biāo)簽放在的底部? 為什么要將標(biāo)簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。1.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助于精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

JavaScript:探索用于高效編碼的數(shù)據(jù)類型 JavaScript:探索用于高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

See all articles