Node基礎-CommonJS模塊化規範

来源:https://www.cnblogs.com/jiajialove/archive/2019/09/09/11493257.html
-Advertisement-
Play Games

1.在本地項目中基於NPM/YARN安裝第三方模塊 package.json 2.安裝在本地和全局的區別 3.NODE入門 NODE本身是基於CommonJS模塊規範設計的,所以模塊是NODE的組成 內置模塊:NODE天生提供給JS調取使用的 第三方模塊:別人寫好的,我們可以基於NPM安裝使用 自定 ...


1.在本地項目中基於NPM/YARN安裝第三方模塊

  • 第一步:在本地項目中創建一個“package.json”的文件
    作用:把當前項目所有依賴的第三方模塊信息(包含:模塊名稱以及版本號等信息)都記錄下來;可以在這裡配置一些可執行的命令腳本等;

    基於YARN會預設生成一個“配置清單”,只是信息沒有手動創建的全面

    npm init -y 或者 yarn init -y

    創建配置清單的時候,項目目錄中不應該出現中文和特殊符號,這樣有可能識別不了

  • 第二步:安裝
    開發依賴:只有在項目開發階段依賴的第三方模塊
    生產依賴:項目部署實施的時候,也需要依賴的第三方模塊

    [npm]
    npm install xxx --save 保存到配置清單的生產依賴中
    --save-dev 保存到開發依賴中

    [yarn]
    yarn add xxx 預設就是保存到生產依賴中
    --dev / -D 保存到開發依賴中

  • 第三步:部署的時候“跑環境”
    不要自己一個個的安裝,只需要執行 npm install 或者 yarn install 即可,npm會自己先檢測目錄中是否有package.json文件,如果有的話,會按照文件中的配置清單依次安裝

=>開發一個項目,我們生成一個配置清單“package.json”,當我們安裝第三方模塊使用的時候,把安裝的模塊信息記錄到配置清單中,這樣以後不管是團隊協作開發還是項目部署上線,我們都沒有必要把node_modules發文件發送給別人,只需要把配置清單傳遞給其它人即可,其他人拿到配置清單後,按照清單中依賴項及版本號,重新安裝即可(重新安裝:“跑環境”)

package.json

{
  "name": "0609DAY1",  //=>模塊名稱
  "version": "1.0.0",  //=>版本號
  "description": "",   //=>模塊的描述
  "main": "index.js",  //=>當前模塊的主入口文件
  "dependencies": {    //=>生產依賴
    "zepto": "^1.2.0"
  },
  "devDependencies": { //=>開發依賴

  },
  "scripts": {  //=>可執行腳本
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

2.安裝在本地和全局的區別

  • [安裝在全局的特點]
    1.所有的項目都可以使用這個模塊
    ->容易導致版本衝突
    ->安裝在全局的模塊,不能基於CommonJS模塊規範調取使用(也就是不能在JS中通過REQUIRE調取使用)

  • [安裝在本地的特點]
    1.只能當前項目使用這個模塊
    ->不能直接的使用命令操作(安裝在全局可以使用命令)

為啥安裝在全局下可以使用命令?

   npm root / -g  查看本地項目或者全局環境下,NPM的安裝目錄

  安裝在全局目錄下的模塊,但部分都會生成一個xxx.cmd的文件,只要有這個文件,那麼xxx就是一個可執行的命令(例如:yarn.cmd => yarn就是命令)

  @IF EXIST "%~dp0\node.exe" (
    "%~dp0\node.exe"  "%~dp0\node_modules\yarn\bin\yarn.js" %*
  ) ELSE (
    @SETLOCAL
    @SET PATHEXT=%PATHEXT:;.JS;=;%
    node  "%~dp0\node_modules\yarn\bin\yarn.js" %*
  )

能否即安裝在本地,也可以使用命令操作?
可以,但是需要配置package.json中的scripts

  • 1.把模塊安裝在本地,如果是支持命令操作的(會在node_modules的bin中生成xxx.cmd的命令文件,只不過這個文件無法在全局下執行 =>不能直接用命令)

  • 2.在package.json的scripts中配置需要執行的命令腳本
    "scripts": {
    "zxt": "lessc -v" 屬性名自己設置即可,屬性值是需要執行的命令腳本,根據需要自己編寫(可以配置很多命令的)
    }

  • 3.npm run zxt / yarn zxt 這樣的操作就是把配置的腳本執行
    ->首先到配置清單的scripts中查找
    ->找到把後面對應的屬性值(執行腳本)執行
    ->執行腳本的時候,會到本地node_modules中的bin文件加查找,沒有的話,在向NPM安裝的全局目錄下查找

3.NODE入門

NODE本身是基於CommonJS模塊規範設計的,所以模塊是NODE的組成

  • 內置模塊:NODE天生提供給JS調取使用的
  • 第三方模塊:別人寫好的,我們可以基於NPM安裝使用
  • 自定義模塊:自己創建一些模塊

CommonJS模塊化設計的思想(AMD/CMD/ES6 MODULE都是模塊設計思想)

  1.CommonJS規定,每一個JS都是一個單獨的模塊(模塊是私有的:裡面涉及的值和變數以及函數等都是私有的,和其它JS文件中的內容是不衝突的)

  2.CommonJS中可以允許模塊中的方法互相的調用
    B模塊中想要調取A模塊中的方法
      =>A導出
      =>B導入

  [導出]
    CommonJS給每一個模塊(每個JS)中都設置了內置的變數/屬性/方法
      module:代表當前這個模塊[object]
      module.exports:模塊的這個“屬性”是用來導出當前模塊的屬性和方法的 [object]
      exports:是內置的一個“變數”,也是用來導出當前模塊屬性方法的,雖然和module.exports不就是一個東西,但是對應的值是同一個(module.exports=exports 值都是對象)

  [導入]
    require:CommonJS提供的內置變數,用來導入模塊的(其實導入的就是module.exports暴露出來的東西);導入的值也是[object]類型的;


  CommonJS特點:
    1. 所有代碼都運行在模塊作用域,不會污染全局作用域(每一個模塊都是私有的,包括裡面所有的東西也都是私有的,不會和其它模塊產生干擾)

    2. 模塊可以多次載入,但是只會在第一次載入時運行一次,然後運行結果就被緩存了,以後再載入,就直接讀取緩存結果。要想讓模塊再次運行,必須清除緩存。(為了保證性能,減少模塊代碼重覆執行的次數)

    3. 模塊載入的順序,按照其在代碼中出現的順序。CommonJS規範載入模塊是同步的,也就是說,只有載入完成,才能執行後面的操作。

案例:A/B/C三個模塊
A中有一個sum方法:實現任意數求和
B中有一個avg方法:實現任意數求平均(先求和再求平均:B中用到A)
C中調取B中的avg,實現 12,23,34,45,56,67,78,89 求平均數

  require導入規則
     require('./xxx') 或者 ../xxx 再或者 /xxx,這種自己制定路徑的模式,都是為了導入自定義的模塊,換句話說,想要導入自定義的模塊,必須加路徑

     require('xxx') 首先到當前項目的node_modules中查找是否存在這個模塊,不存在找node提供的內置模塊(導入第三方或者內置的)

__dirname:模塊中這個內置變數是當前模塊所在的絕對路徑(具體到盤符:物理路徑 例如:E:\201802LESSON\WEEK9\0609DAY1; 相對路徑:WEEK9\0609DAY1 相對於根目錄的路徑;)

__filename:相對於__dirname來講,多了模塊名稱,例如:E:\201802LESSON\WEEK9\0609DAY1\C.js

4.NODE中的內置模塊

http://nodejs.cn/api/

【fs內置模塊:實現I/O操作】

  let fs = require('fs');

  1. fs.mkdir / fs.mkdirSync:創建文件夾,有Sync的是同步創建,反之沒有是非同步,想要實現無阻塞的I/O操作,我們一般都是用非同步操作完成要處理的事情

  2. fs.readdir / fs.readdirSync:讀取文件目錄中的內容

  3. fs.rmdir :刪除文件夾

  4. fs.readFile:讀取文件中的內容

  5. fs.writeFile:向文件中寫入內容(覆蓋寫入:寫入的新內容會替換原有的內容)

  6. fs.appendFile:追加寫入新內容,原有的內容還在

  7. fs.copyFile:拷貝文件到新的位置

  8. fs.unlink:刪除文件

  ...

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

-Advertisement-
Play Games
更多相關文章
  • 配置主伺服器:主伺服器1 Ip: 192.168.0.1 主伺服器2 Ip: 192.168.0.2 主伺服器1配置 2.1、修改mysql配置文件 Server-id = 1 #這是資料庫ID,此ID是唯一的,主庫預設為1,其他從庫以此ID進行遞增,ID值不能重覆,否則會同步出錯; log-bin ...
  • 裝載請標明出處:https://www.cnblogs.com/tangZH/p/11175120.html 觀察者模式 說白了,就是一個對發生改變,所有依賴於它的對象也發生改變,這是一對多的關係。 比如對象A,對象B,對象C。B與C依賴於A,那麼A發生改變,B與C也將發生改變。此時A是被觀察者,B ...
  • 歡迎參加“決勝Flutter” 實訓課程,這裡是你此次實訓之旅的起點。 本章將帶您快速瞭解移動開發的現狀,然後向您介紹Flutter的發展歷史以及優勢特點,最後一起動手,搭建高效的開發環境。 由於Flutter 跨平臺(同時支持Android、iOS、Web以及PC)的特性,本書將以Mac OS作為 ...
  • 什麼是事件?事件是用戶觸摸手機屏幕,引起的一系列TouchEvent,包括ACTION_DOWN、ACTION_MOVE、ACTION_UP、ACTION_CANCEL等,這些action組合後變成點擊事件、長按事件等。 在這篇文章中,用打Log測試的方法來瞭解Android TouchEvent ...
  • AS報錯:lambda expressions are not supported at this language level 解決方法 1) Source Compatibility選擇1.8; 2) Target Compatibility 選擇1.8. 點擊應用即可。 ...
  • 功能:1.根據數據顯示當前所未完成的事件, 2.可通過輸入框進行事件的添加,可標記已完成的事件併進行刪除,可修改已添加的事件。 ps:插件引入均使用本地文件,需改用靜態CDN。 效果: 代碼實現: ...
  • 最近學習了一下js組件相關知識,但找到的資料比較少,一知半解,先做個簡單的筆記吧。 首先定義一個類,可以在裡面添加方法: //這是個下拉框組件,放在select.js里 <script> var tree = { treeList: function(myContent) { var list='< ...
  • HTML5提供了很多新的標簽,由於HTML5的相容性比較差,HTML5的標簽常用於手機端 CSS3結構偽類選擇器 :first-child 選中第一個元素 :last-child 選中最後一個元素 :nth-child(n) 選中第幾個元素 其中n除了填寫數字代表第幾個元素外,填寫n代表選擇所有元素 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...