如果你已經開發了一些與某個硬件(例如一個液晶顯示器或某種模塊)接口的代碼,如果你能制作并提交一個 JavaScript 模塊(庫),其他人可以通過像 require("libname")這樣的命令來使用,那就太好了。
* 獲取一個 GitHub 賬號
* 訪問 [https://github.com/espruino/EspruinoDocs](https://github.com/espruino/EspruinoDocs) 并點擊右上角的`Fork`。現在你在你的 GitHub 賬號中擁有了所有文檔的自己的副本。
* 點擊`devices`文件夾,在頂部寫著`EspruinoDocs/devices/+`的地方,點擊“+”。
* 以你正在使用的設備命名你的模塊(盡量保持非常簡短和簡潔,比如對于諾基亞液晶顯示器中的驅動芯片可以用 PCD8544),并在末尾添加“.js”,例如 MOD123.js。
將以下模板復制并粘貼到文件中:
~~~
/* Copyright (c) 2014 Your Name. See the file LICENSE for copying permission. */
/*
Quick description of my module...
*/
var C = {
MY : 0x001, // description
PRIVATE : 0x001, // description
CONSTANTS : 0x00423 // description
};
function MOD123(pin1,pin2) {
this.pin1 = pin1;
this.pin2 = pin2;
}
/** 'public' constants here */
MOD123.prototype.C = {
MY : 0x013, // description
PUBLIC : 0x0541, // description
CONSTANTS : 0x023 // description
};
/** Put most of my comments outside the functions... */
MOD123.prototype.foo = function() {
// you can use C.PRIVATE
// or this.C.PUBLIC
};
/** Put most of my comments outside the functions... */
MOD123.prototype.bar = function() {
};
/** This is 'exported' so it can be used with `require('MOD123.js').connect(pin1,pin2)` */
exports.connect = function (pin1, pin2) {
return new MOD123(pin1, pin2);
};
~~~
為了測試你的模塊,我們建議你將其逐字復制到網絡集成開發環境的右側,在頂部加上行`var exports={}`,并且在底部,當你使用該模塊時,寫成`exports.myfunction()`而不是`require('MOD123').myfunction()`。
查看一些其他模塊以獲取示例(盡管其中一些仍然不遵循這種形式)。這里有一些重要的要點需要注意,這將有助于使你的模塊盡可能高效:
首先,要確保模塊的代碼結構清晰,邏輯簡潔,避免不必要的復雜計算和重復操作。
其次,對于資源的使用要合理優化,避免浪費內存等資源。
再者,要考慮模塊在不同場景下的適用性和穩定性,盡量減少可能出現的錯誤情況。
另外,注意代碼的可維護性,添加必要的注釋和文檔,以便其他人理解和使用。
最后,不斷測試和改進模塊,根據實際使用中發現的問題及時進行調整和完善。
* 當一個模塊被加載時,Espruino 在其自身的作用域中執行該文件,然后將在該作用域中定義的變量和函數存儲在模塊的緩存中。
* 在根作用域中定義的任何函數和變量將是公共的,如果在某人的代碼中多次使用該模塊,它們不會被重復。然而,如果你在另一個函數內部定義一個函數,例如在 exports.myfunction 內部,那么每次調用 exports.myfunction 時該函數將再次被創建。
* 當大多數用戶使用 require()時,網絡集成開發環境將加載他們模塊的縮小版本。這意味著:
* * 如果合理的話,任何非公共的常量和函數將被折疊 - 節省空間并使庫更快。
* * 所有的注釋將被移除。
* 即使用戶不使用縮小版本(也許他們將完整版本復制到微型 SD 卡或重新配置網絡集成開發環境的默認值):
* * Espruino 逐字存儲函數的內容(包括注釋),但函數聲明之外的注釋不會占用空間。
* 點擊“提交新文件”。如果你以后想要更改它,你總是可以稍后點擊該文件,然后點擊右上角的“編輯”。
* 現在我們只需要創建一個小的文檔文件,以便其他人可以找到你的模塊。添加另一個文件,這次稱為 MOD123.md。
* 將以下模板復制并粘貼到文件中(注意模塊的第一個關鍵字應該始終是`Module`):
~~~
<!--- Copyright (c) 2014 Your Name. See the file LICENSE for copying permission. -->
My Module's proper title
=====================
* KEYWORDS: Module,Comma,separated,list,of,search,words
A bit about my module. Use the [MOD123](/modules/MOD123.js) ([About Modules](/Modules)) module for it.
You can wire this up as follows:
| Device Pin | Espruino |
| ---------- | -------- |
| 1 (GND) | GND |
| 2 (VCC) | 3.3 |
| 3 (SIGIN) | A0 |
| 4 (SIGNOUT)| A1 |
How to use my module:
var foo = require("MOD123").connect(A0,A1);
foo.usingFoo();
~~~
為了使你的模塊描述格式良好,你只需要以一種稍微特殊的方式來編寫它,這被稱為 Markdown。查看此鏈接以獲取如何使用它的示例,或許也可以看看 GitHub 中的其他模塊。
如果你的模塊有多個函數,你可能還想在文件末尾添加這個。這將掃描 JavaScript 文件以查找導出的函數和形式為 `/**...*/ `的注釋 - 這些隨后將被包含作為你模塊的參考。
~~~
Reference
---------
* APPEND_JSDOC: MOD123.js
~~~
你也可以添加`APPEND_USES`,這樣如果其他人編寫教程并在頂部寫著`USES: MOD123`,它們將會在你模塊的頁面上列出:
~~~
Using
-----
* APPEND_USES: MOD123
~~~
* 就是這樣!點擊“提交新文件”。
* 當你把一切都弄成你想要的樣子時,在查看你的 GitHub 倉庫主頁面時,點擊“拉取請求”。
* 確保它顯示的是正確的內容,然后點擊`點擊為此比較創建拉取請求`并輸入一個簡短的描述。
* 最后點擊`發送拉取請求`,你就完成了!我們將能夠接收你的更改并將它們與其他所有內容合并!
- Espruino簡介
- API
- 全局Globals
- acceleration()
- analogRead(pin)
- analogWrite(pin, value, options)
- atob(base64Data)
- btoa(binaryData)
- changeInterval(id, time)
- clearInterval(id)
- clearTimeout(id)
- clearWatch(id)
- compass()
- decodeURIComponent(str)
- digitalPulse(pin, value, time)
- digitalRead(pin)
- digitalWrite(pin, value)
- dump()
- echo(echoOn)
- edit(funcName)
- encodeURIComponent(str)
- eval(code)
- getPinMode(pin)
- getSerial()
- getTime()
- isFinite(x)
- isNaN(x)
- load(filename)
- parseFloat(string)
- parseInt(string, radix)
- peek16(addr, count)
- peek32(addr, count)
- peek8(addr, count)
- pinMode(pin, mode, automatic)
- poke16(addr, value)
- poke32(addr, value)
- poke8(addr,value)
- print(text, ...)
- require(moduleName)
- reset(clearFlash)
- save()
- setBusyIndicator(pin)
- setDeepSleep(sleep)
- setInterval(function, timeout, args, ...)
- setSleepIndicator(pin)
- setTime(time)
- setTimeout(function, timeout, args, ...)
- setWatch(function, pin, options)
- shiftOut(pins, options, data)
- show(image)
- trace()
- ESP8266
- ESP8266.crc32
- ESP8266.deepSleep
- ESP8266.dumpSocketInfo
- ESP8266.getFreeFlash
- ESP8266.getResetInfo
- ESP8266.getState
- ESP8266.logDebug
- ESP8266.neopixelWrite
- ESP8266.ping
- ESP8266.printLog
- ESP8266.readLog
- ESP8266.reboot
- ESP8266.setCPUFreq
- ESP8266.setLog
- ESP32
- ESP32.deepSleep(us)
- ESP32.deepSleepExt0(pin, level)
- ESP32.deepSleepExt1(pinVar, mode)
- ESP32.enableBLE(enable)
- ESP32.enableWifi(enable)
- ESP32.getState()
- ESP32.getWakeupCause()
- ESP32.reboot()
- ESP32.setAtten(pin, atten)
- ESP32.setBLE_Debug(level)
- ESP32.setOTAValid(isValid)
- Wifi
- event associated
- event auth_change
- Wifi.connect(ssid, options, callback)
- event connected
- event dhcp_timeout
- Wifi.disconnect(callback)
- event disconnected
- Wifi.getAPDetails(callback)
- Wifi.getAPIP(callback)
- Wifi.getDetails(callback)
- Wifi.getHostByName(hostname, callback)
- Wifi.getIP(callback)
- Wifi.getStatus(callback)
- Wifi.ping(hostname, callback)
- event probe_recv
- Wifi.restore()
- Wifi.save(what)
- Wifi.scan(callback)
- Wifi.setAPIP(settings, callback)
- Wifi.setConfig(settings)
- Wifi.setHostname(hostname, callback)
- Wifi.setIP(settings, callback)
- Wifi.setSNTP(server, tz_offset)
- event sta_joined
- event sta_left
- Wifi.startAP(ssid, options, callback)
- Wifi.stopAP(callback)
- Wifi.turbo(enable, callback)
- Modules
- Modules.addCached(id, sourcecode)
- Modules.getCached()
- Modules.removeAllCached()
- Modules.removeCached(id)
- Flash
- Flash.erasePage(addr)
- Flash.getFree()
- Flash.getPage(addr)
- Flash.read(length, addr)
- Flash.write(data, addr)
- Storage
- Storage.compact(showMessage)
- Storage.debug()
- Storage.erase(name)
- Storage.eraseAll()
- Storage.getFree(checkInternalFlash)
- Storage.getStats(checkInternalFlash)
- Storage.hash(regex)
- Storage.list(regex, filter)
- Storage.open(name, mode)
- Storage.optimise()
- Storage.read(name, offset, length)
- Storage.readArrayBuffer(name)
- Storage.readJSON(name, noExceptions)
- Storage.write(name, data, offset, size)
- Storage.writeJSON(name, data)
- StorageFile
- StorageFile.erase()
- StorageFile.getLength()
- StorageFile.pipe(destination, options)
- StorageFile.read(len)
- StorageFile.readLine()
- StorageFile.write(data)
- 模塊 Modules
- 使用模塊進行工作
- 內置模塊
- Espruino 模塊
- 來自 Github(或互聯網上的任何地方)
- 從 Storage 加載模塊
- 從 NPM 加載模塊
- 從一個本地文件夾
- 從 SD 卡 加載模塊
- 從互聯網加載模塊
- 已有模塊
- 常見問題
- 編寫和提交模塊(或更改)