- JavaScript:Moving to ES2015
- Ved Antani Simon Timms Narayan Prusty
- 742字
- 2021-07-09 19:07:44
Modules
When you are writing a lot of code, you soon reach a point where you have to start thinking about how you want to organize the code. Node modules are CommonJS modules that we discussed earlier when we discussed module patterns. Node modules can be published to the Node Package Manager (npm) repository. The npm repository is an online collection of Node modules.
Creating modules
Node modules can be either single files or directories containing one or more files. It's usually a good idea to create a separate module directory. The file in the module directory that will be evaluated is normally named index.js
. A module directory can look as follows:
node_project/src/nav --- >index.js
In your project directory, the nav
module directory contains the module code. Conventionally, your module code needs to reside in the index.js
file—you can change this to another file if you want. Consider this trivial module called geo.js
:
exports.area = function (r) { return 3.14 * r * r; }; exports.circumference = function (r) { return 3.14 * 3.14 * r; };
You are exporting two functions via exports
. You can use the module using the require
function. This function takes the name of the module or system path to the module's code. You can use the module that we created as follows:
var geo = require('./geo.js'); console.log(geo.area(2));
As we are exporting only two functions to the outside world, everything else remains private. If you recollect, we discussed the module pattern in detail—Node uses CommonJS modules. There is an alternative syntax to create modules as well. You can use modules.exports
to export your modules. Indeed, exports
is a helper created for modules.exports
. When you use exports
, it attaches the exported properties of a module to modules.exports
. However, if modules.exports
already has some properties attached to it, properties attached by exports
are ignored.
The geo
module created earlier in this section can be rewritten in order to return a single Geo
constructor function rather than an object containing functions. We can rewrite the geo
module and its usage as follows:
var Geo = function(PI) { this.PI = PI; } Geo.prototype.area = function (r) { return this.PI * r * r; }; Geo.prototype.circumference = function (r) { return this.PI * this.PI * r; }; module.exports = Geo;
Consider a config.js
module:
var db_config = { server: "0.0.0.0", port: "3306", user: "mysql", password: "mysql" }; module.exports = db_config;
If you want to access db_config
from outside this module, you can use require()
to include the module and refer the object as follows:
var config = require('./config.js'); console.log(config.user);
There are three ways to organize modules:
- Using a relative path, for example,
config = require('./lib/config.js')
- Using an absolute path, for example,
config = require('/nodeproject/lib/config.js')
- Using a module search, for example,
config = require('config')
The first two are self-explanatory—they allow Node to look for a module in a particular location in the filesystem.
When you use the third option, you are asking Node to locate the module using the standard look method. To locate the module, Node starts at the current directory and appends ./node_modules/
to it. Node then attempts to load the module from this location. If the module is not found, then the search starts from the parent directory until the root of the filesystem is reached.
For example, if require('config')
is called in /projects/node/
, the following locations will be searched until a match a found:
/projects/node /node_modules/config.js
/projects/node_modules/config.js
/node_modules/config.js
For modules downloaded from npm, using this method is relatively simple. As we discussed earlier, you can organize your modules in directories as long as you provide a point of entry for Node.
The easiest way to do this is to create the ./node_modules/supermodule/
directory, and insert an index.js
file in this directory. The index.js
file will be loaded by default. Alternatively, you can put a package.json
file in the mymodulename
folder, specifying the name and main file of the module:
{ "name": "supermodule", "main": "./lib/config.js" }
You have to understand that Node caches modules as objects. If you have two (or more) files requiring a specific module, the first require
will cache the module in memory so that the second require
will not have to reload the module source code. However, the second require
can alter the module functionality if it wishes to. This is commonly called monkey patching and is used to modify a module behavior without really modifying or versioning the original module.
- Advanced Quantitative Finance with C++
- Visual C++程序設計教程
- 高手是如何做產品設計的(全2冊)
- Banana Pi Cookbook
- 從學徒到高手:汽車電路識圖、故障檢測與維修技能全圖解
- 面向對象程序設計(Java版)
- SharePoint Development with the SharePoint Framework
- Mastering Apache Spark 2.x(Second Edition)
- Asynchronous Android Programming(Second Edition)
- Visual C++開發入行真功夫
- Fast Data Processing with Spark(Second Edition)
- QGIS 2 Cookbook
- H5+移動營銷設計寶典
- Solr權威指南(下卷)
- 美麗洞察力:從化妝品行業看顧客需求洞察