intro_node.js
You can say
$ node file.js
or
node some/path/to/your/file.js
Let's make a file called hello_world.js with the following code,
hello_world.js
console.log("Hello world");
and let's also make an app.js.
app.js
var greeter = require("./hello_world.js");
// the require says go to the current working directory
// the './' and find the hello_world.js file.
If we run app.js
$ node app.js
we should see hello world in our terminal. This is because node is finding the file hello_world.js in the current working directory, thus the ./ in the require call, and then running it.
If we create a folder called sub_folder and move hello_world.js into it
$ mkdir sub_folder
$ mv hello_world.js sub_folder/
When we run node app.js we get an error. This is because now hello_world.js is in ./sub_folder/hello_world.js, so we should change our require statement to reflect it.
app.js
var greeter = require("./sub_folder/hello_world.js");
If we make another_folder and move app.js into it we have tell node to go up a directory to find the right file.
$ mkdir another_folder
$ mv app.js another_folder/
$ node another_folder/app.js
So to fix this we update our require statement.
var greeter = require("../sub_folder/app.js");
The ../ just means go up a directory and find the sub_folder with the app.js file.
Notice in the above we are doing a require for a file that basically logs hello world... Who cares?
First, let's checkout what the value of that greeter variable is.
another_folder/app.js
var greeter = require("../sub_folder/app.js");
console.log("The value of greeter is", greeter);
and run the app.js file
$ node another_folder/app.js
When we run this file we should see that greeter is {}. The file automatically returns an empty object without us doing anything to it.
Well, now we can update our hello_world.js to actually expose functionality after we require it.
sub_folder/hello_world.js
console.log("hello world!");
/*
module.exports is a key we can use
to expose functionality on the
object that get required in another
file... just try the following
and see.
*/
module.exports.sayHello = function () {
return "Hello!!";
};
Now when we run our app.js
$ node another_folder/app.js
we see that it is an object with the sayHello: function key value pair.
Let's modify our app.js to have it use the sayHello method.
another_folder/app.js
var greeter = require("../sub_folder/app.js");
console.log("The value of greeter is", greeter);
// log the return of the greeter.sayHello method
console.log(greeter.sayHello());
The module.exports utility doesn't just work with exposing different methods. We can tell module.exports to just expose a function or some other value entirely.
Let's modify our hello_world.js to demonstrate this.
sub_folder/hello_world.js
console.log("hello world!");
// now we only expose a string "foobar"
module.exports = "foobar";
and we should probably modify our app.js to not try to use our now non-existent sayHello method.
another_folder/app.js
var greeter = require("../sub_folder/app.js");
console.log("The value of greeter is", greeter);
Running our app.js
$ node another_folder/app.js
We see that
The value of greeter is foobar
Similarly to how we exposed the foobar value, we can also expose just a function.
sub_folder/hello_world.js
console.log("hello world!");
/*
module.exports is a key we can use
to expose functionality on the
object that get required in another
file... just try the following
and see.
*/
module.exports = function () {
return "Hello!!";
};
And running our app.js we see that
The value of greeter is function () {
return "Hello!!";
}