配置一個簡單而實用的 JavaScript 開發環境
在一個框架、庫和工具無處不在的時代,可能很多人都會面臨選擇困難癥。
根據我的經驗,寫一個模塊或 CLI 工具前你所要做的第一件事就是設置一個開發環境。對這個步驟有人喜歡有人討厭。但不管怎樣,它可能總是花掉你很多時間,你得不停地調整你配置的方方面面。
當然,你可能使用 webpack、eslint、jasmine 甚至是 TypeScript(而最終可能只換來“很棒”的編譯錯誤信息)。事實上,大部分情況下,作為開發者,我們可以使用一些幾乎不用配置的工具。通常來說,這些“開箱即用”的工具完全可以接受的,并將幫助我們直接解決問題,同時還能提供幾乎實時的閉環反饋。
當我們談論最小化配置,我們最關注的是測試、代碼規范檢查、監控文件內容改變以及確保你在提交代碼前沒搞砸前面這些點。
下面是一個幫助你用五分鐘或者更少的時間(取決于 NPM 的心情^^)一步步從無到有建立開發環境的步驟:
初始化 Node.js 項目和 Git 倉庫
# Create a directory and cd into it (#protip – $_ holds argument of your last command)
$ mkdir awesome-module && cd $_
# Initialize Node.js project with default settings
$ npm init --yes
# Create initial folders and files
$ mkdir lib test
$ touch index.js lib/meaningOfLife.js test/index.test.js test/meaningOfLife.test.js
# Initialize GIT repository and create initial commit
$ git init
$ git add -A; git commit -am "Awesome Module, day one"
安裝工具
在這里,我們將使用四個簡單的模塊,每個模塊完成一件事。 Ava 負責測試, Standard 負責代碼規范檢查, Chokidar-cli 負責文件監控,最后 Precommit-hook 負責自動運行 npm 腳本。
為什么選擇這幾個工具?因為它們不需要任何配置即符合我們使用者的思維習慣。這樣少一件事情(指修改配置)需要思考和擔心。
$ npm i --save-dev ava standard chokidar-cli precommit-hook
記得創建 .gitignore 文件并添加 node_modules 目錄到文件中!我們不需要將依賴的庫提交到我們的代碼倉庫里。
配置工具
打開 package.json 并添加這些腳本到你的文件:
"scripts": {
"test": "ava",
"lint": "standard",
"dev": "chokidar "**/*.js" -c "standard && ava""
},
"pre-commit": ["test", "lint"],
就這樣,一切都搞定了!一旦你運行 npm run dev ,所有的 JS 都會通過 Standard.js 進行規范檢查,并通過 Ava 進行單元測試。不用額外做別的什么了,你現在就可以開始你的工作。
同樣,提交 Git 提交時,這些腳本也會被自動運行。除非你的測試和代碼檢查都通過,否則你無法提交代碼。
兩件值得注意的事:
- 你無須安裝 standard 或 ava 到你的系統全局域下,因為它們可以從 node 上下文里執行。
- 因為我們使用 && 代替 j ,在 dev 腳本里,單元測試在代碼檢查未通過前不會被觸發。這讓反饋閉環更快(即避免無謂的測試消耗時間)。
用這個配置工作
因為環境假定你使用 TDD(測試驅動開發)方式工作(你可能應該這么做!),一但你運行你的 dev 腳本,你可以創建測試并且將它們添加到測試用例集中,不需要重啟監控程序或者重新構建。
讓我們創建第一個測試文件:
// test/meaningOfLife.test.js
const test = require("ava")
const meaningOfLife = require("../lib/meaningOfLife")
test("Real meaning of life", (t) => {
t.is(meaningOfLife(), 42)
})
一但你保存文件,你會立即發現你的一個測試用例未通過,讓我們來修復它:
// lib/meaningOfLife.js
module.exports = () => 42
好,現在測試通過了!就是這么簡單。讓我們創建另一個模塊,它接受一個數值參數,讓它的值加倍,然后對這個模塊進行單元測試,看看是否它與我們的“生命的意義”模塊能夠很好地集成到一起(注意,到這里已經是集成測試,而不是單元測試!)。
And we are back to green! It's as simple as that. Let's create another module that'll multiply a numeric parameter, unit test this module and see whether it’ll work nicely with our “meaning of life” (note that it’s already an integration test, not unit!).
// lib/multiply.js
module.exports = (number) => {
if (typeof number !== "number") throw new TypeError("Only numbers can be multiplied!")
return number * 2
}
// test/multiply.test.js
const test = require("ava")
const multiply = require("../lib/multiply")
test("Can multiply numbers", (t) => {
t.is(multiply(10), 20)
})
test("Throws when you try to multiply non-number value", (t) => {
t.throws(() => multiply("ohai!"), "Only numbers can be multiplied!")
})
現在,讓我們把兩者放在一次測試:
// test/index.test.js
const test = require("ava")
const awesomeModule = require("../index")
test("Works nicely together", (t) => {
t.is(awesomeModule(), 84)
})
// index.js
const meaningOfLife = require("./lib/meaningOfLife")
const multiply = require("./lib/multiply")
module.exports = () => multiply(meaningOfLife())
它沒問題!只需要幾分鐘時間,我們就可以讓一切就緒。
我們作為開發者,經常被閃閃發光的新工具迷住。我們似乎忘記了那些工具本來應該讓我們工作得更輕松、更快速和不容易出錯。通常情況,最簡單的解決方案就足夠了。與其花費大量的時間在配置環境上,不如將時間花在編寫軟件本身上。而遵循上面的步驟將讓你可以達到這一目的。
一但你的項目開始增長,你可能會發現自己需要引入一些更復雜的東西。然而,在大部分情況下,這一問題不會出現。上面那些工具會在很長很長一段時間內符合你的需求。
來自:https://www.h5jun.com/post/setting-up-a-minimal-yet-useful-javascript-dev-environment.html