Nodejs把前端开发带入一个全新的阶段,他使得js能够跑在服务端上,大大强化了js这门语言的可塑性。
OK,环境配置不提,配置好了以后,直接来跑一些简单的demo
以前一直没搞懂nodejs复杂的目录(其实是不懂linux),老把文件目录和运行时的目录搞错。
在gitbash下,先进入对应的目录,例如我的js文件在 D:\node\nodejs下,那么应该:
$ cd d:
$ cd node/nodejs
这样就OK啦,如果想跟IDE进行配合也不是不行,步骤如下:
1.在node.exe同级下建立project,命名为 nodejs :
2.在IDE中添加新建项目,添加刚才的文件夹路径:
欧~~尅!
接着,在IDE里面新建几个js文件,然后在我们的Node上面跑一跑(CreateServer那个DEMO就不做了)。
建立第一个文件:hello.js (null文件)
建立第二个文件:world.js(null文件)
两个文件可以在同级目录,也可以不在。
将下列代码填入hello.js:
function hello(){
console.log("hello")
}
exports.hello =hello();
打开gitBash,找到IDE中工程的目录(最好把js文件放在工程目录下即可,或者单独建一个js文件夹):
然后输入:$ node hello.js
然后将下列代码填入 world.js :
var world = require("./hello.js");
world.hello
运行之,得出下图:
可以看到,两次的运行结果一样。hello.js的运行结果为hello不足为奇,那么world.js为什么也输出hello呢?
这是因为在hello.js中,打包出来一个公共模块,exports.hello =function(){....}
而在world.js中,引入了这个模块,并且赋值给变量world:
var world = require('./hello.js') /*引入【hello.js里面打包的
模块】*/
/*此时,world相当于拥有共有模块的所有属性和方法了,那么此时,这个
world有一个方法为hello,我们调用这个hello方法,world.hello ,自然
而然输出hello*/
如果将hello.js改进一下,
var i=0 ;
function hello(){
++i;
console.log("hello for " + i)
};
运行 node hello.js
输出: //hello for 1
同时更改world.js:
var world = require('./hello.js')
var world1 = require('./hello.js')
world.hello
world1.hello
运行 $node world.js
输出//hello for 1甭管运行几次,都是这个结果
这说明,引入模块时,只有第一次引入时会初始化模块。
模块的集合:包(package)
所谓的包,就是内部集成了好多模块,主要使用一个入口文件作为包的入口,该文件的导出对象作为包的公有模块:
一 ---nodejs
|一 ----js
| -----main.js
| ------head.js
| ------body.js
| ------footer.js
|一 ------package.json
此时,main.js是包的入口和导出对象模块,在main.js中,很有可能引入了head.js、body.js、footer.js的导出模块,然后写入一些功能和方法,最后导出一个公有方法,供其他的包或者模块使用。
当模块的文件名是index.js,加载模块时可以使用模块所在目录的路径代替模块文件路径,因此接着上例,以下两条语句等价。
当引用包的入口文件时,require(‘./node/nodejs/main.js’)这样给人感觉仿佛在引用一个模块,而不是整个包。
解决方法是,将Main.js命名为index.js,这样,在引入包的入口文件时,直接填写包入口文件的路径:
var cat = require('./js/index.js');
var cat = require('/js');
//上面两条语句等价
这样处理后,就只需要把包目录路径传递给require函数,感觉上整个目录被当作单个模块使用,更有整体感。
也可以用json文件来声明入口:
{
'main':'./main.js'
}
这样,在引入包的入口文件时 require(‘./node/nodejs’)时,会优先查找json文件,并从中读取入口配置,注意,此时的json一定要在引用的路径之下。