node.js - 包、express

来源:https://www.cnblogs.com/heymar/archive/2022/04/13/16142046.html
-Advertisement-
Play Games

首先,要先在這裡分享一下我的喜悅,從昨天開始其實一直都在喜悅當中的,我收到了我的第一份offer,這感覺不擺了,比第一桶金都還舒服,雖然我還沒收到第一桶金哈哈,不過offer都得了應該也快了。 今天的內容有點小多,容我慢慢道來 1. 首先我們看到包的管理配置文件以及下包慢的問題,在我們多人協作下,是 ...


首先,要先在這裡分享一下我的喜悅,從昨天開始其實一直都在喜悅當中的,我收到了我的第一份offer,這感覺不擺了,比第一桶金都還舒服,雖然我還沒收到第一桶金哈哈,不過offer都得了應該也快了。

今天的內容有點小多,容我慢慢道來

1.

首先我們看到包的管理配置文件以及下包慢的問題,在我們多人協作下,是不是要經常把自己的代碼共用出去通過git、github之類的,那麼我應該發現一個問題,一個項目文件,有30M大小,而代碼只有區區2M左右的記憶體,剩餘的都給誰了?都給了第三方包也就是node_modules裡面的內容,所以為了輕量化,我們在共用代碼的時候肯定是不能帶node_modules這個文件夾的,把她扔進.gitignore文件裡面忽略掉,那我們沒有了第三方包的依賴怎麼執行代碼呢,第三方包肯定還是要的,沒有怎麼能行,我們有一個package.json的文件在這裡面存放了安裝的所有的第三方包的內容。

1.1

快速創建packagejson

只需要在項目的文件中執行node init -y

要註意一下,只能在英文目錄下去創建這個文件,這裡的英文是當前目錄為英文,也就是上一級為中文都沒的關係,然後就是當我們運行npm i安裝第三方包的時候就會把信息給到這個json文件中,所以我們在安裝前要先創建json文件。

1.2

dependencies節點

這是這個json裡面的節點名,記錄了npm安裝了哪些包

1.3

既然我們沒有包,又知道了所有需要的包名,那麼怎麼來一次性安裝所有的包?

npm install或者i不添加包名即可安裝所有的包

1.4

卸載包

npm uninstall 包名沒有簡寫

1.5

devDependencies節點

這個節點也是保存的安裝的包,有些包是我們在項目開發過程中才會用到,而有些包使我們開發上線都會用到的包,我們一般把前者放在devDependencies節點裡面,把後者放在dependencies節點裡面。

當然他也有特定的安裝方式

npm i 包名 -D

2.

然後我們看到下包會慢的一些原因,是因為我們的npm的伺服器是國外的,通過海底光纜傳過來的數據當然慢,所以這個時候我們需要把npm的鏡像伺服器換掉,通過npm config set registry可以查看當前npm的伺服器

再通過npm config set registry='淘寶或者騰訊的鏡像地址'就可以設置過來了。

之所以粗略帶過,是因為我們有簡便方法,通過npm先安裝一個nrm全局可用工具,全局就需要在包名後面添加一個-g

然後nrm ls 可查看當前可設置的伺服器地址,再用nrm use 加這個伺服器名字即可使用。

3.

包的分類

我們把包分為兩大類,一個是項目包,就是被安裝到node_modules裡面的包,這裡面又有開發依賴包放在devDependencies節點裡面的和核心依賴包開發上線都用得到的,

二個是全局包,放在c盤目錄下麵的,安裝的時候通過-g參數安裝的。

註意一下:只有工具性質的包才有全局安裝的必要,因為他們提供了終端的一些命令

3.1

i5ting_toc

可以把md文件轉換為html的小工具,註意是工具,這個其實挺方便的,前面一直用的Markdownpad2。

怎麼來使用呢?

i5ting_toc  -f  md文件路徑 -o表示瀏覽器打開

3.2

一個規範包的結構必須要包含三個東西

①每個包必須是單獨目錄

②包的頂級目錄下必須包含package.json

③packag.json必須包含name、version、main三個屬性

接下來我們就來做一個 屬於自己的包:要實現的功能就為:可以格式化日期、可以對html中的字元轉義為特殊字元又轉義回來。

首先要初始化包的基本結構,創建一個包的文件夾,裡面放三個文件,index.js、package.json、README.md分別表示包入口文件、包的配置文件、包說明文檔。

接下來在初始化package.json裡面的內容,{name:使我們包的名字到時候npm網站上搜索也是這個名字,所以使用前先去網站看一下有沒有重名的,

version:版本號,

main:入口文件,說明瞭我們的導入就為這個文件要註意一下,如果說外界導入的時候只是導入了一個目錄,並不是這個js文件,那麼node就會去找這個目錄下的package.json裡面的main再去找入口文件,

description:詳細介紹,

keywords:關鍵字是一個數組,

license:開原許可協議}

接下來就是在index.js中定義三個功能的函數了 ,這裡有一個很重要的概念,模塊化,我們的格式化時間是不是需要一個函數,還要補零是不是又要一個函數,那麼這兩個函數可以放在一個單獨的js文件裡面,我們的html轉為特殊字元、特殊字元返回html也需要一個單獨的js文件,完成過後需要在各自的文件把函數放進exports裡面,然後index.js導入兩個js文件他此時得到的是一個放有這幾個函數的對象,我們需要通過es6語法中的擴展運演算法,給她解構出來,就只有逗號分隔的函數了,這裡有點繞可以配合代碼好好理解下。

 

 

 

// 1.格式化時間
function dateFormat(time) {
    const date = new Date(time)
    let y = date.getFullYear()
    let m = getZero(date.getMonth() + 1)
    let d = getZero(date.getDate())
    let h = getZero(date.getHours())
    let mm = getZero(date.getMinutes())
    let s = getZero(date.getSeconds())
    return `${y}-${m}-${d} ${h}:${mm}:${s}`
}

// 2.補零函數
function getZero(n) {
    return n < 10 ? '0' + n : n
}
//  6.1共用成員
module.exports = {
    dateFormat
}
// 4.html轉義函數
function getHtmlCode(htmlStr) {
    return htmlStr.replace(/<|>|"|&/g, match => {
        switch(match) {
            case '<':
                return '&lt;'
            case '>':
                return '&gt;'
            case '"':
                return '&quot;'
            case '&':
                return '&amp;'
        }
    })
}
// 5.還原html
function getHtml(htmlStr) {
        return htmlStr.replace(/&lt;|&gt;|&quot;|&amp;/g, match => {
            switch(match) {
                case '&lt;':
                    return '<'
                case '&gt;':
                    return '>'
                case '&quot;':
                    return '"'
                case '&amp;':
                    return '&'
            }
        })
}

// 6.2共用成員
module.exports = {
    getHtmlCode,
    getHtml
}
index.js
//
6.3 導入 const date = require('./src/dateFormat') const strEscape = require('./src/strEscape') // 3.共用成員 module.exports = { ...date, ...strEscape }

test.js

const bag = require('./index')
console.log(bag.dateFormat(new Date()));
console.log(bag.getHtmlCode('<h2>我是一個大溫柔"嘻嘻"ss&</h2>'));
console.log(bag.getHtml('&lt;h2&gt;我是一個大溫柔&quot;嘻嘻&quot;ss&amp;&lt;/h2&gt;'));

 

 3.3

我們繼續看到怎麼來編寫包的說明文檔,就是把包的作用以及用法,註意事項說明清楚即可

## 安裝 ```
npm i mybag-huang
```
## 導入 ```js
const mybag = require('mybag-huang')
```
## 格式化時間
```js
const time = mybag.dateFormat(new Date())
``` ## 轉義html代碼中的特殊字元 ```js
 mybag.getHtmlCode('<h2>我是一個大溫柔"嘻嘻"ss&</h2>')
 ```
 ## 轉義html代碼中的正常字元  ```js
 mybag.getHtml('&lt;h2&gt;我是一個大溫柔&quot;嘻嘻&quot;ss&amp;&lt;/h2&gt;')
```
## 開源協議 ISC 3.4 發佈包 首先註冊npm賬號,然後登陸 賬號是在終端上登錄:npm login 然後到所處的包的 目錄下 npm pbulish既可以發佈在npm網站上,但是要註意一下,需要切回到官方的伺服器才能夠發佈成功。 刪除已發佈的包npm unpublish 包名 --force 只能刪除發佈後72小時內的包,刪除後二十四小時內不可再發佈相同的包 4. 模塊載入機制 我們的模塊都是優先從緩存當中來載入的,當我們導入過後就會第一時間載入在緩存中,所以導入相同的文件不管你導入多少次,都是載入的第一個文件。 內置模塊的載入機制 內置模塊載入的優先順序最高,比如說內置模塊和我們的自定義模塊如果名字一樣,那麼導入的時候是認為這是一個內置模塊的。 自定義模塊的載入機制 require裡面的文件必須以./或者../開頭不然就會被當為內置或者第三方模塊。 如果說省略了擴展名,那麼node會依次開始查找js、json、node的文件擴展名都沒有找到就會報錯。 第三方模塊的載入機制 require不是內置模塊也不是,/開頭那麼就會從當前目錄的modules文件夾裡面開始照這個第三方模塊而且沒找到的話會繼續往上一級找,直到找到根目錄為止。 當你把目錄作為require的路徑時,會首先去找package裡面的main如果沒有指定,就會載入當前目錄下的index.js都沒有就會報錯。   5. express 5.1 首先什麼叫做express 他和http內置模塊相同,專門創建web伺服器的 5.2 基本使用 1.安裝 npm i express 2.創建web伺服器 ①導入express ②創建伺服器 const app = express() ③diaoyong app.listen(埠號,回調函數) 3. 監聽get、post app.get/post(url,回調函數)
// 1.導入
const express = require('express')
// 2.創建伺服器
const app = express()

// 4.監聽客戶端的get和post請求並響應
app.get('/index.html ', (req, res) => {
    res.send({
        "name" : "zs",
        "sex" : "男",
        "age" : 19
    })
})
app.post('/index', (req, res) => res.send('post成功'))
// 3.開啟伺服器
app.listen(80, () => {
    console.log(
        'express server running at http://127.0.0.1'
    )
})

4

獲取url中的參數

通過req.query獲得一個對象保存的參數

const express = require('express')
const app = express()
app.get('/', (req, res) => {
    res.send(req.query)
})
app.listen(80, () => {
    console.log('express server running at http://127.0.0.1');
})

獲取url當中的動態參數

req.params

const express = require('express')
const app = express()
app.get('/:id', (req, res) => {
    console.log(req.params);
})
app.listen(80, () => {
    console.log('express server running at http://127.0.0.1');
})

 

5.3

托管靜態資源

express.static()這個方法可以創建靜態伺服器的時候,將文件目錄下的css、圖片、js等共用出去對外開放。

app.use(express.static('文件夾'))要註意一點對誰開放那麼這個目錄是不會出現在url路徑當中的

const express = require('express')
const app = express()

app.use(express.static('./clock'))


app.listen(80, () => console.log('express server running at http://127.0.0.1'))

 

 

 

 如果要托管多個目錄就把代碼執行多次即可,但是要註意如果訪問的文件名有幾個目錄都有的話,會按照順序執行前面的。

掛在路徑首碼

const express = require('express')
const app = express()

app.use('/abc',express.static('./clock'))


app.listen(80, () => console.log('express server running at http://127.0.0.1'))

 

 5.4

今天最後的內容更新一個很實用的小工具,nodemon直接全局安裝,他的作用就是我們平時改了一下代碼,比如伺服器必須重新斷開重新連接,才會看到效果就會很麻煩,而有了這個工具後直接執行nodemon 文件名他就會檢測到我們的代碼修改情況自動去重新啟動,就跟我們html的live一樣

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 HarmonyOS 中關係資料庫的增刪改查是非常常見的一種技術,今天進行寫一個 demo 對數據的增刪改查進行詳細的講解,在開發之前我們需要學習“關係資料庫”,“結果集”這兩篇開發文檔,接下來我們分為“Api使用”,“demo實現”,“運行效果”三個步驟進行描述 1. Api 使用 1.1 創建 ...
  • HMS Core應用內支付服務(In-App Purchases,IAP)為應用提供便捷的應用內支付體驗和簡便的接入流程。該服務支持客戶端和服務端兩種開發形式,具體可以參考官方文檔 上次,我們分享和總結了有關com.huawei.hmf.tasks.Task/應用伺服器驗證,驗證購買token 失敗 ...
  • Drawable表示一種可繪製的內容,可以由圖片或者顏色組成.Android下的Drawable有BitmapDrawable、GradientDrawable、LayerDrawable等等 1.BitmapDrawable 它表示一張圖片,我們可以直接將圖片放在drawable目錄下,該圖片就可 ...
  • Handler是我們在開發中經常會接觸到的類,因為在Android中,子線程一般是不能更新UI的. 所以我們會使用Handler切換到主線程來更新UI,那Handler是如何做到實現不同線程之間的切換呢? 先看一個例子 1.ThreadLocal的簡單使用 public class HandlerA ...
  • 一、Bundle Android的Activity、Service、Receiver都支持在Intent傳遞Bundle數據,Bundle實現了Parcelable介面, 所以能很方便的在不同進程之間進行數據傳傳輸.比如A應用打開B應用的某個Activity,如果要傳遞自定義的類型, 可以繼承自Pa ...
  • 簡單開頭 首先技術面試官會根據簡歷里所寫的項目和個人掌握技術棧提問(我不知道已經改過多少次簡歷了,因為前期投簡歷是真的是沉在茫茫大海,撈漂流瓶都撈不到的那種) 我的技術棧:(Vue還在苦苦的自學當中,隨便推薦一下coderwhy老師B站的教學視頻,真的不錯,講得深入淺出,越聽越想聽)地址:https ...
  • 經過前面七天的學習,對Node.js開發已經有了一個初步的認識,今天繼續學習Node.js在web開發參數傳遞相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • Vue實戰-購物車案例 普通購物車 實現的功能:添加商品到購物車,計算總價 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>購物車</title> <script src="https://cdn.bootc ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...