主頁 > 企業開發 > 一篇文章搞定什么是nodeJs它和NPM關系與應用

一篇文章搞定什么是nodeJs它和NPM關系與應用

2023-05-09 08:19:35 企業開發

現在前端的入門門檻越來越高了,不再是單純 html+css+js,各種前端框架 層出不窮,各種ui組件庫層出不窮,

模塊化,打包化,各種工具庫層出不窮,前端變成大前端 ,甚至前端可以搞定整個專案,通過node作為服務端api,

這里我們主角就是nodeJs

什么是nodejs

javaScript是一門腳本語言,通常被用來撰寫、執行本地源代碼,腳本語言需要一個決議器才能運行,HTML檔案中的JavaScript代碼由瀏覽器決議執行,而自行執行JavaScript代碼則需要Node.js決議器才能運行,

每個決議器都是一個運行環境,允許JavaScript定義各種資料結構和執行各種計算,同時也允許JavaScript呼叫運行環境提供的內置物件和方法,瀏覽器環境下,JavaScript常被用來操作DOM等功能,因此瀏覽器提供了document等內置物件;在Node.js環境下,JavaScript通常用來處理磁盤檔案和搭建HTTP服務器,因此Node.js提供了fs、http等內置物件,

Node.js是一個基于V8引擎的JavaScript運行環境,V8引擎具有快速執行JavaScript代碼的能力,并且性能非常優秀,Node.js專注于優化一些特殊用例,并提供了替代的API,在非瀏覽器環境下更好地運行V8引擎,

作為一種服務器端JavaScript平臺,Node.js能夠快速創建網路應用程式,同時,它也支持前后端JavaScript編程,為開發者提供了更高效的系統設計和一致性,

NodeJS特性

以下是一些使得Node.js成為軟體架構師的首選的重要特征:

  1. 異步和事件驅動的Node.js庫- 所有API都是異步非阻塞的,這意味著Node.js服務器不必等待API回傳資料,它可以立即移動到下一個API呼叫,利用Node.js事件通知機制來獲取從API呼叫獲得的回應,這種異步的事件驅動機制,使得服務器可以高效地回應并快速處理大量請求,

  2. 非常快的Node.js代碼執行- Node.js代碼在谷歌Chrome的V8 JavaScript引擎上運行,速度非常快,

  3. 單執行緒但高度可擴展的Node.js - Node.js使用事件回圈單執行緒模型,事件機制有助于服務器以非阻塞的方式回應請求,這使得服務器具備高度可擴展性,相比傳統服務器使用創建執行緒等方式來處理請求,Node.js使用單執行緒和單一程式處理方式,能夠更好地處理大量請求,并具備更高的可擴展性,例如,Node.js可以比傳統的Apache HTTP服務器處理更多請求,

  4. 無緩沖的Node.js應用 - Node.js應用程式從來不需要緩沖任何資料,這些應用程式只需輸出塊中的資料,不需要在記憶體中緩沖大量資料,

總之,以上特點都讓Node.js成為軟體架構師的首選,因為它可以高效地回應請求并處理大量請求,從而提高系統的性能和可擴展性,

統一在Javascript瀏覽器之外的實作, CommonJS

自從Netscape瀏覽器問世以來,JavaScript就一直在探索本地編程的路, 不幸的是,當時服務端JavaScript的發展基本上是借鑒其他服務器端語言的實作,因此缺乏特色和實用價值, 隨著JavaScript在前端應用的廣泛應用以及服務端JavaScript的推進,JavaScript現有的規范變得非常弱,難以滿足JavaScript在大規模應用方面的需求,在以JavaScript為宿主語言的環境中,只有基本的原生物件和型別,其他物件和API取決于宿主的提供,因此,JavaScript缺乏以下功能:

  1. 模塊系統:沒有原生支持的閉包作用域或依賴管理,
  2. 標準庫:除了一些核心庫外,沒有檔案系統API和IO流API等,
  3. 標準介面:缺乏像Web服務器或資料庫這樣的統一介面,
  4. 包管理系統:不能自動加載和安裝依賴,

因此,CommonJS(http://www.commonjs.org)規范應運而生,目的是為了構建JavaScript在包括Web服務器、桌面、命令列工具以及瀏覽器中的生態系統,

CommonJS試圖定義一套可供普通應用程式使用的API,以填補JavaScript標準庫過于簡單的不足, 其終極目標是制定類似于C ++標準庫的規范,使基于CommonJS API的應用程式可以在不同的環境下運行,就像使用C ++撰寫的應用程式可以使用不同的編譯器和運行時函式庫一樣,例如:模塊、包、系統、二進制、控制臺、編碼、檔案系統、套接字、單元測驗等等,

Node.js是CommonJS規范最流行的實作之一,Node.js實作了require方法作為其模塊引入的方法,同時,NPM則基于CommonJS規范定義的模塊規范,實作了依賴管理、模塊自動安裝等功能,

常用框架

  1. express:完善、出現早、檔案全、社區大
  2. koa:超前,完善中
  3. hapi:復雜,適合大型專案

NodeJS下載安裝

NodeJS提供了一些安裝程式可以從nodejs.org下載安裝,

管理Nodejs版本

n

n是一位鼎鼎大名的TJ Holowaychuk所寫的Node.js模塊,(鼎鼎大名的Express框架作者)旨在提供一個簡單、直觀的方式來管理Node.js版本,正如其名字所示,它追求的理念就是簡潔——無需使用子Shell、組態檔或臃腫的API,僅提供簡單易用的功能,

n模塊的主要功能是讓用戶可以輕松地安裝、使用和管理不同版本的Node.js,如果您想要安裝n模塊,可以按照以下步驟進行操作:

npm install n -g

安裝完成之后,直接輸入n后輸出當前已經安裝的node版本以及正在使用的版本(前面有一個o),你可以通過移動上下方向鍵來選擇要使用的版本,最后按回車生效,

安裝最新的版本

n latest

安裝穩定版本

n stable

n后面也可以跟隨版本號比如:

n v0.10.26

n 0.10.26

洗掉某個版本

$ n rm 0.10.1

以指定的版本來執行腳本

$ n use 0.10.21 some.js

常用命令

n          # 顯示所有已下載版本
n 10.16.0  # 下載指定版本
n lts      # 查看遠程所有 LTS Node.js 版本
n run 10.16.0 # 運行指定的 Node.js 版本
  n                              Display downloaded Node.js versions and install selection
  n latest                       Install the latest Node.js release (downloading if necessary)
  n lts                          Install the latest LTS Node.js release (downloading if necessary)
  n <version>                    Install Node.js <version> (downloading if necessary)
  n install <version>            Install Node.js <version> (downloading if necessary)
  n run <version> [args ...]     Execute downloaded Node.js <version> with [args ...]
  n which <version>              Output path for downloaded node <version>
  n exec <vers> <cmd> [args...]  Execute command with modified PATH, so downloaded node <version> and npm first
  n rm <version ...>             Remove the given downloaded version(s)
  n prune                        Remove all downloaded versions except the installed version
  n --latest                     Output the latest Node.js version available
  n --lts                        Output the latest LTS Node.js version available
  n ls                           Output downloaded versions
  n ls-remote [version]          Output matching versions available for download
  n uninstall                    Remove the installed Node.js

n 只適用于 macOS 和 Linux ,不適用于 Windows,

nvm

nvm是一款流行的Node.js版本管理工具,可以通過命令列界面實作快速、簡便的Node.js版本安裝、切換和管理,使用nvm,您可以輕松地安裝和切換不同版本的Node.js,以適應不同的開發需求和應用場景,同時,nvm還具備方便的命令列介面和完善的檔案支持,讓用戶能夠快速上手并進行高效的開發作業,

nvm 只適用于 macOS 和 Linux 用戶的專案,如果是 Windows 用戶,可以使用 nvm-windows 、nodist 或 nvs 替換,

# 方式1 瀏覽器打開下面鏈接下載
https://github.com/nvm-sh/nvm/blob/v0.39.1/install.sh
# 下載完成后,通過命令安裝
sh install.sh

# 方式2 推薦
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

# 方式3
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

安裝程序中如果遇到一些奇怪的問題,可以查看下 nvm 補充說明,

常用命令

nvm ls                # 查看版本安裝所有版本
nvm ls-remote         # 查看遠程所有的 Node.js 版本
nvm install 17.0.0    # 安裝指定的 Node.js 版本
nvm use 17.0.0        # 使用指定的 Node.js 版本
nvm alias default 17.0.0  # 設定默認 Node.js 版本
nvm alias dev 17.0.0  # 設定指定版本的別名,如將 17.0.0 版本別名設定為 dev

fnm


fnm 是一款快速簡單 ?? 的 Node.js 版本管理器,使用 Rust 構建,

主要特點包括:

  1. ?? 跨平臺支持,包括:macOS、Windows、Linux;
  2. ? 單一檔案,輕松安裝,即時啟動 ;
  3. ?? 以速度為設計理念;
  4. ?? 適用于 .node-version.nvmrc 檔案;

macOS / Linux 環境:

# bash, zsh and fish shells
curl -fsSL https://fnm.vercel.app/install | bash

Windows 環境:

# 管理員模式打開終端,安裝后只能使用管理員模式打開使用

choco install fnm

# 安裝完成還需要手動設定環境變數

Linux/macOS/Windows 環境也可以直接下載二進制檔案安裝,下載地址:https://github.com/Schniz/fnm/releases

常用命令

fnm -h             # 查看幫助
fnm install 17.0.0 # 安裝指定 Node.js 版本
fnm use 17.0.0     # 使用指定 Node.js 版本
fnm default 17.0.0 # 設定默認 Node.js 版本

Node.js模塊系統

為了讓Node.js的檔案可以相互呼叫,Node.js提供了一個簡單的模塊系統,
模塊是Node.js 應用程式的基本組成部分,檔案和模塊是一一對應的,換言之,一個 Node.js 檔案就是一個模塊,這個檔案可能是JavaScript 代碼、JSON 或者編譯過的C/C++ 擴展,

模塊化編程

隨著網頁應用程式的不斷發展,網頁的功能越來越類似于桌面程式,需要許多不同的人協同作業并進行進度管理、單元測驗等等,因此,軟體工程的方法逐漸成為網頁開發者必不可少的技能,在此情境下,Javascript模塊化編程成為一項迫切的需求,通過模塊化編程,開發者只需要專注于實作核心業務邏輯,而其他的任務則可以由其他開發者撰寫的模塊來實作,

模塊化編程的優勢在于可以避免常見的問題,比如命名沖突檔案依賴

通過模塊化編程,我們可以避免在代碼中出現重復的變數名或函式名,從而確保代碼的正確性和可維護性,

另外,使用模塊化編程還可以解決檔案依賴問題,開發者可以輕松地管理代碼中的各個模塊之間的依賴關系,并確保它們能夠正確地加載和運行,這些優勢使得模塊化編程成為現代網頁開發中不可或缺的一部分,

Node中模塊分類

NodeJS中模塊分為2類:原生模塊和檔案模塊,

原生模塊即Node.jsAPI提供的原聲模塊,原生模塊在啟動時已經被加載,(如:os模塊、http模塊、fs模塊、buffer模塊、path模塊等)

//呼叫原生模塊不需要指定路徑
var http = require('http');

檔案模塊為動態加載模塊,加載檔案模塊的主要由原生模塊module來實作和完成,原生模塊在啟動時已經被加載,而檔案模塊則需要通過呼叫Node.js的require方法來實作加載,

//呼叫檔案模塊必須指定路徑,否則會報錯
var sum = require('./sum.js');

模塊操作

在撰寫每個模塊時,都有require、exports、module三個預先定義好的變數可供使用,

require 加載模塊

require方法接受以下幾種引數的傳遞:

  1. http、fs、path等,原生模塊,
  2. ./mod或../mod,相對路徑的檔案模塊,
  3. /pathtomodule/mod,絕對路徑的檔案模塊,
  4. mod,非原生模塊的檔案模塊,

require函式在當前模塊中被使用以加載其他模塊,傳入模塊名后,將回傳一個包含匯出物件的模塊,模塊名可以是相對路徑(以./開頭)或絕對路徑(以/或C:這樣的盤符開頭),此外,模塊名中的.js擴展名可以省略,以下是一個示例:

var foo1 = require('./foo');
var foo2 = require('./foo.js');
var foo3 = require('/home/user/foo');
var foo4 = require('/home/user/foo.js');
//foo1 ~ foo4 中保存的是同一個模塊的匯出物件,
//加載node 核心模塊
var fs = require('fs');
var http = require('http');
var os = require('os');
var path = require('path');

加載和使用json檔案

var data = https://www.cnblogs.com/kenx/archive/2023/05/08/require('./data.json');

exports 創建模塊

exports物件是當前模塊的匯出物件,用于匯出模塊公有方法和屬性,別的模塊通過require函式使用當前模塊時得到的就是當前模塊的exports物件,以下例子中匯出了一個公有方法,

//sum.js
exports.sum = function(a,b){
    return a+b;
}

//main.js
var m = require("./sum");
var num = m.sum(10,20);
console.log(num);

module

通過module物件可以訪問到當前模塊的一些相關資訊,但最多的用途是替換當前模塊匯出物件,例如模塊默認匯出物件默認是一個普通物件,如果想改為一個函式可以通過如下方式: 匯出一個普通函式:

//sum.js
function sum(a,b){
    return a+b;
}
module.exports= sum;
//main.js
var sum = require('./sum');
sum(10,20);// 30

匯出一個建構式:

//hello.js
function hello(){
    this.name ="你的名字";
    this.setName = function(name){
        this.name = name;
    }
    this.sayName = function(){
        alert(this.name);
    }
}
module.exports= hello;

//main.js
var hello = require('./hello.js');
var o = new hello();
o.setName('張三');
o.sayName(); // 張三

模塊初始化

一個模塊中的JS代碼僅在模塊第一次被使用時執行一次,并在執行程序中初始化模塊的匯出物件,之后,快取起來的匯出物件被重復利用,

模塊加載優先級

模塊加載優先級:已經快取模塊 > 原生模塊 > 檔案模塊 > 從檔案加載

Node.js 的 require方法中的檔案查找策略如下: 由于Node.js中存在4類模塊(原生模塊和3種檔案模塊),盡管require方法極其簡單,但是內部的加載卻是十分復雜的,其加載優先級也各自不同,如下圖所

模塊路徑決議規則

  1. 內置模塊
    如果傳遞給require函式的是NodeJS內置模塊名稱,不做路徑決議,直接回傳內部模塊的匯出物件,例如require('fs'),

  2. node_modules目錄
    NodeJS定義了一個特殊的node_modules目錄用于存放模塊,例如某個模塊的絕對路徑是/home/user/hello.js,在該模塊中使用require('foo/bar')方式加載模塊時,則NodeJS依次嘗試使用以下路徑,

/home/user/node_modules/foo/bar
/home/node_modules/foo/bar
/node_modules/foo/bar

主模塊

通過命令列引數傳遞給NodeJS以啟動程式的模塊被稱為主模塊,主模塊負責調度組成整個程式的其它模塊完成作業,例如通過以下命令啟動程式時,main.js就是主模塊,

NPM應用

什么是NPM

Node 成功的主要因素之一是它廣受歡迎的軟體包管理器——npm,因為 npm 使 JavaScript 開發人員可以快速方便地共享軟體包

npm(“Node 包管理器”)是 JavaScript 運行時 Node.js 的默認程式包管理器,
Node Packaged Modules 簡稱

Node本身提供了一些基本API模塊,但是這些基本模塊難以滿足開發者需求,Node需要通過使用NPM來管理開發者自我研發的一些模塊,并使其能夠共用與其他開發者

npm 由兩個主要部分組成:

. 用于發布和下載程式包的 CLI(命令列界面)工具

. 托管 JavaScript 程式包的 在線存盤庫

為了更直觀地解釋,我們可以將存盤庫 npmjs.com 視為一個物流集散中心,該中心從賣方(npm 包裹的作者)那里接識訓物的包裹,并將這些貨物分發給買方(npm 包裹的用戶),

為了促進此程序,npmjs.com 物流集散中心雇用了一群勤勞的袋熊(npm CLI),他們將被分配給每個 npmjs.com 用戶作為私人助理, 因此,dependencies(依賴項)會如下傳遞給 JavaScript 開發人員:

發布 JS 軟體包的程序如下:

NPM使用

NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,常見的使用場景有以下幾種:

  1. 允許用戶從NPM服務器下載別人撰寫的第三方包到本地使用,
  2. 允許用戶從NPM服務器下載并安裝別人撰寫的命令列程式到本地使用,
  3. 允許用戶將自己撰寫的包或命令列程式上傳到NPM服務器供別人使用,

由于新版的nodejs已經集成了npm,所以之前npm也一并安裝好了,同樣可以通過輸入

 npm -v

來測驗是否成功安裝,命令如下,出現版本提示表示安裝成功:

$ npm -version
9.5.1

升級更新NPM

$ sudo npm install npm -g

使用NPM安裝模塊

有一個簡單安裝任何Node.js模塊,語法如下:

$ npm install <Module Name>

例如,下面是安裝一個著名的Node.jsweb框架模塊的命令叫 express:

$ npm install express

現在,你可以在js檔案中使用此模塊如下:

var express = require('express');

全域安裝VS本地安裝

本地安裝 默認情況下,NPM安裝指定包默認會安裝到本地,本地安裝指的是包安裝在當前目錄中node_modules檔案夾中,本地安裝的包都可以通過require()方法進行訪問,例如我們安裝Express模塊:

$ npm install express

列出所有本地安裝的模塊

$ npm ls

全域安裝 全域安裝包都存盤在系統目錄中,我們可以在nodejs的CLI(命令列界面)使用,但是不能直接使用require()方法進行訪問,例如安裝http-server包:

//全域安裝 -g
$ npm install -g http-server
//使用node CLI  
$ http-server

卸載模塊

使用下面的命令卸載Node.js模塊

npm uninstall express

更新模塊

npm update express

搜索模塊

搜索使用NPM包名

npm search express

下載三方包

NPM建立了一個NodeJS生態圈,NodeJS開發者和用戶可以在里邊互通有無,

當你需要下載第三方包時,首先要知道有哪些包可用,npmjs.com提供了可以根據包名來搜索的平臺,但是如果不知道包名可以百度一下,知道了包名后,就可以使用命令去安裝了,例如:Express

npm install express

下載完成之后,express包就放在了工程目錄下的node_modules目錄中,在代碼中只需要通過reuqire('express')的方式去參考,無需指定包路徑,
以上命令默認下載最新版本第三方包,如果要下載指定版本,可以在包名后面追加@,例如通過如下命令可以下載0.0.1版本的express,

npm install [email protected]

如果使用到的第三方包比較多,在終端下一個包一條命令的安裝非常不方便,因此NPM對package.json的欄位做了擴展,允許在其中添加三方包依賴,

{
    "name":"test",
    "main":"./lib/main.js",
    "dependencies":{
        "http-server":"3.2.1"
    }
}

這樣處理后,在工程目錄下就可以使用npm install命令批量安裝三包了,最重要的是,當以后吧test專案上傳到了NPM服務器,別人下載這個包時,NPM會根據包中宣告的三方依賴包進行自動下載依賴,這樣用戶只需要關心要使用的包,不用管其依賴的三方包,

給NPM服務器發布自己的包

第一次使用NPM發布自己的包需要在npmjs.com注冊一個賬號

npm的常用命令

npm -v          #顯示版本,檢查npm 是否正確安裝,

npm install express   #安裝express模塊

npm install -g express  #全域安裝express模塊

npm list         #列出已安裝模塊

npm show express     #顯示模塊詳情

npm update        #升級當前目錄下的專案的所有模塊

npm update express    #升級當前目錄下的專案的指定模塊

npm update -g express  #升級全域安裝的express模塊

npm uninstall express  #洗掉指定的模塊

NPM專案中運用

package.json

每個 JavaScript 專案(無論是 Node.js 還是瀏覽器應用程式)都可以被當作 npm 軟體包,并且通過 package.json 來描述專案和軟體包資訊,

我們可以將 package.json 視為快遞盒子上的運輸資訊,

當運行 npm init 初始化 JavaScript/Node.js 專案時,將生成 package.json 檔案,檔案內的內容(基本元資料)由開發人員提供:

. name:JavaScript 專案或庫的名稱,

. version:專案的版本,通常,在應用程式開發中,由于沒有必要對開源庫進行版本控制,因此經常忽略這一塊,但是,仍可以用它來定義版本,

. description:專案的描述,

. license:專案的許可證,

npm scripts

package.json 還支持一個 scripts 屬性,可以把它當作在專案本地運行的命令列工具,例如,一個 npm 專案的 scripts部分可能看起來像這樣:

{
  "scripts": {
    "build": "tsc",
    "format": "prettier --write **/*.ts",
    "format-check": "prettier --check **/*.ts",
    "lint": "eslint src/**/*.ts",
    "pack": "ncc build",
    "test": "jest",
    "all": "npm run build && npm run format && npm run lint && npm run pack && npm test"
  }
}

eslint,prettier,ncc,jest 不是安裝為全域可執行檔案,而是安裝在專案本地的 node_modules/.bin/ 中,

最新引入的 npx 使我們可以像在全域安裝程式一樣運行這些 node_modules 專案作用域命令,方法是在其前面加上 npx ...(即npx prettier --write ** / *,ts),

dependencies vs devDependencies

這兩個以鍵值物件的形式出現,其中 npm 庫的名稱為鍵,其語意格式版本為值, 大家可以看看 Github 的 TypeScript 操作模板中的示例:

{
  "dependencies": {
    "@actions/core": "^1.2.3",
    "@actions/github": "^2.1.1"
  },
  "devDependencies": {
    "@types/jest": "^25.1.4",
    "@types/node": "^13.9.0",
    "@typescript-eslint/parser": "^2.22.0",
    "@zeit/ncc": "^0.21.1",
    "eslint": "^6.8.0",
    "eslint-plugin-github": "^3.4.1",
    "eslint-plugin-jest": "^23.8.2",
    "jest": "^25.1.0",
    "jest-circus": "^25.1.0",
    "js-yaml": "^3.13.1",
    "prettier": "^1.19.1",
    "ts-jest": "^25.2.1",
    "typescript": "^3.8.3"
  }
}

這些依賴通過帶有 --save 或 --save-dev 標志的 npm install 命令安裝, 它們分別用于生產和開發/測驗環境

. ^:表示最新的次版本,例如, ^1.0.4 可能會安裝主版本系列 1 的最新次版本 1.3.0,

. ?:表示最新的補丁程式版本,與 ^ 類似, ?1.0.4 可能會安裝次版本系列 1.0 的最新次版本1.0.7,

所有這些確切的軟體包版本都將記錄在 package-lock.json 檔案中,

package-lock.json

該檔案描述了 npm JavaScript 專案中使用的依賴項的確切版本,如果 package.json 是通用的描述性標簽,則 package-lock.json 是成分表,

就像我們通常不會讀取食品包裝袋上的成分表(除非你太無聊或需要知道)一樣,package-lock.json 并不會被開發人員一行一行進行讀取,

package-lock.json 通常是由 npm install 命令生成的,也可以由我們的 NPM CLI 工具讀取,以確保使用 npm ci 復制專案的構建環境,

各種前端專案構建build工具

Node, NPM, Grunt, Gulp, Bower, Webpack, Browserify, Yeoman, Brunch…… 前端目前有很多很多名詞,看著這些感覺永遠也學不完, 不要被這些名詞嚇唬住,這些工具出現的目的是讓我們的作業更加簡單,

快速掌握build工具秘訣

快速掌握這些工具,抓住幾個核心概念:

1.幫助你安裝

2.幫助你做事

當你接觸到一個新的開發工具的時候,你首先需要搞清楚一個東西:“這個工具的目的是幫我安裝東西,還是幫我做事?”

安裝類的工具

npm、Bower和Yeoman幾乎什么東西都能裝,它們可以用來安裝前端庫,例如Angular.js或是React.js,它們還可以為你的開發環境安裝服務器,它們可以安裝測驗庫,它們甚至可以幫你安裝其他的前端開發工具,

做事類的工具

Grunt、Webpack、Require.js、Brunchu和Gulp則更加復雜一點,這類工具的目標,是在web開發中幫你完成自動化,有的時候,這類工具所做的事情,被稱為“任務(task)”

為了完成這些任務,這類工具經常需要自己的包和插件生態,每一個工具都會使用不同的方式來完成任務,這些工具所做的事情也不盡相同,一些工具,擅長處理那些你所指定的任務,例如Grunt和Gulp等工具,還有一些工具,只只專注于一件事情,例如處理JavaScript的依賴,例如Browserify和Require.js等工具,

build工具的“祖宗”是Node和npm

Node和npm負責安裝和運行所有這些工具,因此你的所有專案中都會有它們的身影,由于這個原因,很多開發者在安裝新的工具之前,都會盡可能的嘗試使用這兩個工具解決問題,

它們兩個一個負責安裝,一個負責幫你做事情,

. Node是做事工具

. npm則是安裝工具

npm可以安裝Angular.js和React.js等庫,它還可以安裝服務器,讓你的應用在開發階段可以在本地運行,它還可以安裝很多其他工具,幫你完成很多事情,例如簡化代碼,

而Node,則是幫你完成事情的,例如運行JavaScript檔案,以及服務器等,

如果你剛剛開始學習,那么Node和npm都是必學的東西,隨著你的專案不斷豐富,你將會逐漸知道這兩個工具的極限能力,當它們無法滿足你的需要的時候,就是你需要開始安裝其他工具的時候了,

build其實就是production-ready版本的應用

開發者經常會把JavaScript和CSS拆分成獨立的檔案,

獨立檔案的好處,是讓你可以專注于撰寫針對性較強的代碼,讓每一部分代碼只針對一個問題,以免日后代碼多到讓你自己都難以管理,但是當你的應用準備好被推向市場的時候,專案記憶體在多個JavaScript或是CSS檔案并不是一個好主意,當用戶訪問你的網站的時候,每一個檔案都需要獨立的HTTP請求,這會讓站點加載速度下降,

解決方法就是,給專案創建“build”,它要將所有CSS檔案合并成一個檔案,然后再合并JavaScript檔案,這樣一來,你就可以將檔案完成最小化,要想創建這個build,你需要使用build工具,

最正確工具組合”這么個東西不存在

使用哪些工具,完全是你自己說了算的事情,

你也可以選擇什么工具都不用,但是要記住,隨著專案的發展,復制、黏貼、整合、開啟服務器等事情會讓你慢慢手忙腳亂起來,

你也可以只使用Node和npm,其他工具一概不用,對于新手來說,這種方式很好,但是和上一條一樣,慢慢你會開始感到力不從心,

或者,除了Node和npm之外,你也可以使用少數幾個其他工具,那么,你的開發程序將會以Node和npm為核心,然后搭配Grunt和Bower,或是Webpack或是Gulp和Bower,

使用正確的工具,能夠幫你將很多繁瑣的事情實作自動化,但是使用工具的代價,就是你需要付出學習成本,

build工具學習成本較高,因此你只需要學習你用的上的工具

專案開發本身就已經很復雜了,你可能要使用新的語言或是框架,你可能需要應付復雜的業務邏輯,而引入新的工具,只會讓你的學習成本變得更高,

對此,我的建議是,只學習那些你用的上的工具,其他的就先緩一緩吧,

學習任何一種新東西,最好的方式就是進行實踐,例如,不要為了學習Grunt而去學習,你可以在你的專案中去嘗試運用,

如果你覺得對您有幫助關注公眾號,程式員三時 我會給大家不定期分享熱門技術,做開源專案,技術交流,面試,學習,分享自己入行多年一些感受和經驗

參考

什么是 npm

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/551963.html

標籤:其他

上一篇:Marked.js讓您的檔案編輯更加輕松自如

下一篇:返回列表

標籤雲
其他(158682) Python(38123) JavaScript(25407) Java(18024) C(15222) 區塊鏈(8262) C#(7972) AI(7469) 爪哇(7425) MySQL(7171) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5336) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4567) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 一篇文章搞定什么是nodeJs它和NPM關系與應用

    現在前端的入門門檻越來越高了,不再是單純 html+css+js,各種前端框架 層出不窮,各種ui組件庫層出不窮。 模塊化,打包化,各種工具庫層出不窮,前端變成大前端 ,甚至前端可以搞定整個專案,通過node作為服務端api, 這里我們主角就是nodeJs 什么是nodejs javaScript是 ......

    uj5u.com 2023-05-09 08:19:35 more
  • Marked.js讓您的檔案編輯更加輕松自如

    ? 低代碼應用平臺——kintone既可以保留更改記錄,也有流程管理的功能,在公司內部分享會議記錄啊、wiki等檔案或學習資料等時非常的便利。 kintone還有豐富的文本編輯框,可以對內容進行編輯提高易讀性。但是還是有不少人覺得如果能夠使用Markdown編輯,將更加輕松,文本也將更加美觀。※特別 ......

    uj5u.com 2023-05-09 08:19:19 more
  • ai問答:vue3+pinia+WebSocket 封裝斷線重連(實戰)

    把Socket實體 掛載到全域 為方便梳理,請忽略typescript,一切盡在注釋中 # main.ts import {createApp} from 'vue' import App from './App.vue' import {socket} from "@/xihu/socket" i ......

    uj5u.com 2023-05-09 08:19:12 more
  • 在JS中如何判斷兩個物件是否相等

    在JavaScript中,判斷兩個物件是否相等有多種方法,取決于你對 相等 的定義以及物件屬性的型別。以下是幾種常見的方法: 1. 嚴格相等運算子 ( ) 使用 運算子可以比較兩個物件是否參考同一個物件。如果兩個變數參考了同一個物件,則它們是相等的,否則它們是不相等的。例如: const obj1 ......

    uj5u.com 2023-05-09 08:19:07 more
  • Marked.js讓您的檔案編輯更加輕松自如

    ? 低代碼應用平臺——kintone既可以保留更改記錄,也有流程管理的功能,在公司內部分享會議記錄啊、wiki等檔案或學習資料等時非常的便利。 kintone還有豐富的文本編輯框,可以對內容進行編輯提高易讀性。但是還是有不少人覺得如果能夠使用Markdown編輯,將更加輕松,文本也將更加美觀。※特別 ......

    uj5u.com 2023-05-09 08:17:47 more
  • 在JS中如何判斷兩個物件是否相等

    在JavaScript中,判斷兩個物件是否相等有多種方法,取決于你對 相等 的定義以及物件屬性的型別。以下是幾種常見的方法: 1. 嚴格相等運算子 ( ) 使用 運算子可以比較兩個物件是否參考同一個物件。如果兩個變數參考了同一個物件,則它們是相等的,否則它們是不相等的。例如: const obj1 ......

    uj5u.com 2023-05-09 08:17:40 more
  • 學系統集成專案管理工程師(中項)系列19a_成本管理(上)

    1. 要確保在批準的預算內完成專案 2. 必須考慮專案決策對專案產品、服務或成果的使用成本、維護成本和支持成本的影響 3. 對成本的影響力在專案早期最大 4. 失控原因 4.1. 對工程專案認識不足 4.1.1. 對資訊系統工程成本控制的特點認識不足,對難度估計不足 4.1.2. 工程專案的規模不合 ......

    uj5u.com 2023-05-09 08:16:55 more
  • SPSS計算極值、平均值、中位數、方差、偏度、峰度、變異系數

    本文介紹基于SPSS軟體的經典統計學分析與偏度、峰度等常用統計學指標的計算方法。 首先需要說明,本文所述資料的經典統計學分析,包括計算資料的極值、平均值、中位數、標準差、方差、變異系數、偏度與峰度等常用統計學指標。 首先,打開SPSS軟體。 第一步需要將資料匯入SPSS中。選擇“檔案”,然后選擇“數 ......

    uj5u.com 2023-05-09 08:16:30 more
  • MM 獲取抬頭條件凈價

    SE24 IF_PURCHASE_ORDER_MM IM_HEADER是個介面,由系統負責實體化。 其中GET_CONDITIONS是獲取抬頭條件TAB頁資料,可是直接通過IM_HEADER呼叫方法,回傳的是空值。 查看方法GET_CONDITIONS,根據行號獲取指定的條件定價值。全部的條目在變數 ......

    uj5u.com 2023-05-09 08:16:15 more
  • MM 獲取抬頭條件凈價

    SE24 IF_PURCHASE_ORDER_MM IM_HEADER是個介面,由系統負責實體化。 其中GET_CONDITIONS是獲取抬頭條件TAB頁資料,可是直接通過IM_HEADER呼叫方法,回傳的是空值。 查看方法GET_CONDITIONS,根據行號獲取指定的條件定價值。全部的條目在變數 ......

    uj5u.com 2023-05-09 08:15:55 more