<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用Node進行開發時,必須使用npm,指令碼是npm的最強大和最常見的功能之一。
我將在本文中介紹如何使用npm指令碼。
Npm允許您使用檔案中的scripts
欄位定義指令碼命令package.json
。
{ // ... "scripts": { "build": "node build.js" } }
上面的程式碼是package.json
檔案的一部分,scripts
這裡的欄位是一個物件。它的每個屬性都對應一個指令碼。例如,與該build
命令對應的指令碼為node build.js
。
如果您npm run
在命令列下使用該命令,指令碼將被執行。
$ npm run build # equivalent to execution $ node build.js
在中定義的這些指令碼package.json
稱為npm指令碼。有很多優點:
您可以使用npm run
不帶任何引數的命令來檢視當前專案的所有npm指令碼命令。
$ npm run
npm指令碼的原理非常簡單。無論何時npm run
執行,都會自動建立一個新的shell,並且將在該shell中執行指定的指令碼命令。因此,只要該命令可以由外殼程式(通常是Bash)執行,它就可以用npm指令碼編寫。
特殊的是,由建立的shell npm run
將node_modules/.bin
當前目錄的子目錄新增到PATH
變數中,並且該PATH
變數將在執行後恢復。
這意味著可以直接通過指令碼名稱來呼叫當前目錄的node_modules / .bin子目錄中的所有指令碼,而無需新增路徑。例如,如果當前專案的依賴項中包含Mocha,則只需mocha test
直接編寫:
"test": "mocha test"
而不是像這樣寫:
"test": "./node_modules/.bin/mocha test"
由於對npm指令碼的唯一要求是指令碼可以在shell中執行,因此它們不一定是Node指令碼,並且可以在其中編寫任何可執行檔案。
npm指令碼的退出程式碼也遵循shell指令碼的規則。如果退出程式碼不是0
,則npm將假定指令碼執行失敗。
由於npm指令碼是Shell指令碼,因此可以使用Shell萬用字元。
"lint": "jshint *.js" "lint": "jshint **/*.js"
在上面的程式碼中,*
表示任何檔名,**
表示任何子目錄。
如果要將萬用字元傳遞給原始命令以防止被Shell逸出,則必須逸出星號。
"test": "tap test/*.js"
使用--
指示傳遞給npm指令碼的引數。
"lint": "jshint **.js"
如果將引數傳遞給上述npm run lint命令,則必須編寫如下。
$ npm run lint -- --reporter checkstyle > checkstyle.xml
您也可以在中再次封裝命令package.json
。
"lint": "jshint **.js", "lint:checkstyle": "npm run lint -- --reporter checkstyle > checkstyle.xml"
如果要在npm指令碼中執行多個任務,則需要弄清執行順序。
如果是並行執行(並行並行執行),則可以使用&符號。
$ npm run script1.js & npm run script2.js
如果是順序執行(僅在成功執行前一個任務時才執行下一個任務),則可以使用該&&
符號。
$ npm run script1.js && npm run script2.js
這兩個符號是Bash的功能。另外,您可以使用節點的任務管理模組:script-runner,npm-run-all,redrun。
通常,npm指令碼由使用者提供。但是,npm為兩個指令碼提供了預設值。換句話說,這兩個指令碼無需定義即可直接使用。
"start": "node server.js", "install": "node-gyp rebuild"
在上述程式碼中,預設值npm run start
是node server.js
,提供有一個server.js
在專案的根目錄指令碼; 預設值npm run install
就是node-gyp rebuild
,只要有一個binding.gyp
專案的根目錄下的檔案。
npm指令碼有兩個勾點:pre
和post
。例如,build
指令碼命令的掛鉤是prebuild
和postbuild
。
"prebuild": "echo I run before the build script", "build": "cross-env NODE_ENV=production webpack", "postbuild": "echo I run after the build script
當用戶執行時,它將按以下順序自動執行npm run build
。
npm run prebuild && npm run build && npm run postbuild
因此,可以在這兩個掛鉤中進行一些準備和清理。這是下面的例子。
"clean": "rimraf ./dist && mkdir dist", "prebuild": "npm run clean", "build": "cross-env NODE_ENV=production webpack"
Npm預設提供以下勾點:
自定義指令碼命令也可以與pre
和post
掛鉤一起新增。例如,指令碼命令myscript
具有premyscript
和postmyscript
勾點。但是,double pres和posts無效。例如,prepretest
和postposttest
是無效的。
在npm_lifecycle_event
由npm提供的變數返回當前執行的指令碼的名稱,如pretest
,test
,posttest
,等。因此,您可以使用該變數為npm scripts
同一指令碼檔案中的不同命令編寫程式碼。讓我們看下面的例子。
const TARGET = process.env.npm_lifecycle_event; if (TARGET === 'test') { console.log('Running the test task!'); } if (TARGET === 'pretest') { console.log('Running the pretest task!'); } if (TARGET === 'posttest') { console.log('Running the posttest task!'); }
❝ 請注意,prepublish掛鉤不僅將在npm publish命令之前執行,而且還將在npm install(不帶任何引數)命令之前執行。但是,這種行為很容易使使用者感到困惑,因此npm 4引入了一個prepare行為類似於的新勾點prepublish。從npm 5開始,該prepublish勾點只會在npm publish命令之前執行。 ❞
這是四個常用npm指令碼的簡短版本。
npm start 是短的 npm run start
npm stop 是短的 npm run stop
npm test 是短的 npm run test
npm restart 是短的 npm run stop && npm run restart && npm run start
npm start
,npm stop
和npm restart
都是很好的理解,而npm restart
是實際執行三個指令碼命令的化合物命令:stop
,restart
,start
。並且執行順序如下。
npm指令碼具有非常強大的功能,可讓您使用npm的內部變數。
首先,npm指令碼可以獲取package.json
帶有npm_package_
字首的欄位。例如,package.json
下面是一個。
{ "name": "foo", "version": "1.2.5", "scripts": { "view": "node view.js" } }
然後,該變數npm_package_name返回foo
,並且該變數npm_package_version
返回1.2.5
。
// view.js console.log(process.env.npm_package_name); // foo console.log(process.env.npm_package_version); // 1.2.5
在上面的程式碼中,我們package.json
通過環境變數process.env
物件獲取的欄位值。如果是Bash
指令碼,則可以使用$npm_package_name
和獲得兩個值$npm_package_version
。
該 npm_package_
字首也支援巢狀的package.json
領域。
"repository": { "type": "git", "url": "xxx" }, scripts: { "view": "echo $npm_package_repository_type" }
在上面的程式碼中,您可以使用獲取欄位的type
屬性。repositorynpm_package_repository_type
這是另一個例子。
"scripts": { "install": "foo.js" }
在上面的程式碼中,npm_package_scripts_install
變數的值等於foo.js
。
npm config get xxx
也可以通過npm_config_
字首獲取npm的設定變數(命令返回的值)。例如,您可以使用獲取當前模組的release
標籤npm_config_tag
。
"view": "echo $npm_config_tag",
請注意,環境變數可以覆蓋中的config物件package.json。
{ "name" : "foo", "config" : { "port" : "8080" }, "scripts" : { "start" : "node server.js" } }
在上面的程式碼中,npm_package_config_port變數返回8080。並且可以通過以下方法覆蓋此值。
$ npm config set foo:port 80
env命令可以列出所有環境變數。
"env": "env"
// delete the directory "clean": "rimraf dist/*", // build an HTTP service locally "serve": "http-server -p 9090 dist/", // open the browser "open:dev": "opener http://localhost:9090", // real-time refresh "livereload": "live-reload --port 9091 dist/", // build an HTML file "build:html": "jade index.jade > dist/index.html", // Re-execute the build as long as the CSS file has changed. "watch:css": "watch 'npm run build:css' assets/styles/", // Re-execute the build as long as the HTML file has changed "watch:html": "watch 'npm run build:html' assets/html", // Deploy to Amazon S3. "deploy:prod": "s3-cli sync ./dist/ s3://example-com/prod-site/", // build favicon "build:favicon": "node scripts/favicon.js",
nrm(npm registry manager)是npm的映象源管理工具,有時候國外資源太慢,使用這個就可以快速地在 npm 源間切換。
在命令列執行以下命令,全域性安裝nrm
。
npm install -g nrm
執行命令nrm ls
檢視可選的源。
其中,帶*
的是當前使用的源,上面的輸出表明當前源是taobao源。
如果要切換到cnpm源或者其他映象,您可以使用nrm use 源名稱
進行切換:
nrm use cnpm
你可以增加客製化的源,特別適用於新增企業內部的私有源,執行命令nrm add <registry> <url>
,其中reigstry為源名,url為源的路徑。
nrm add registry http://registry.npm.frp.trmap.cn/
刪除,執行以下命令:
nrm del <registry> url
你還可以通過 nrm test
測試相應源的響應時間,從而決定使用哪種映象!
nrm test taobao
以上就是10分鐘內講解Npm指令碼使用教學的詳細內容,更多關於Npm指令碼教學的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45