artnikpro
artnikpro

Reputation: 5869

How to realy include a js file in Node.js

I did't found any realy working solution of this issue on Google, so...

There is a module called vm, but people say it is very heavy. I need some simple function, like PHP's include, which works like the code of an including file inserts right into the place in code you need and then executes.

I tryed to create such function

function include(path) {
    eval( fs.readFileSync(path) + "" );
}

but it is not as simple... it is better if I'll show you why in example.

Let's say I need to include file.js file with content

var a = 1;

The relative file look like this

include("file.js");
console.log(a); // undefined

As you already realized a is undefined because it is not inherits from a function.

Seems the only way to do that is to type this long creepy code

eval( fs.readFileSync("file.js") + "" );
console.log(a); // 1

every time with no wrapper function in order to get all the functionality from a file as it is.

Using require with module.exports for each file is also a bad idea...

Any other solutions?

Upvotes: 0

Views: 267

Answers (2)

Maroshii
Maroshii

Reputation: 4017

What you are trying to do breaks modularity and goes against Node.js best practices.

Lets say you have this module (sync-read.js):

var fs = require('fs');

module.exports = {
  a: fs.readFileSync('./a.json'),
  b: fs.readFileSync('./b.json'),
  c: fs.readFileSync('./c.json')
}

When you call the module the first time ...

var data = require('./sync-read');

... it will be cached and you wont read those files from disk again. With your approach you'll be reading from disk on every include call. No bueno.

You don't need to append each of your vars to module.exports (as in comment above):

var constants = {
  lebowski: 'Jeff Bridges',
  neo: 'Keanu Reeves',
  bourne: 'Matt Damon'
};

function theDude() { return constants.lebowski; };
function theOne() { return constants.neo; };
function theOnly() { return constants.bourne; };

module.exports = {
  names: constants,
  theDude : theDude,
  theOne : theOne
  // bourne is not exposed
}

Then:

var characters = require('./characters');

console.log(characters.names);

characters.theDude();
characters.theOne();

Upvotes: 0

T.J. Crowder
T.J. Crowder

Reputation: 1073968

Using require with module.exports for each file is also a bad idea...

No, require is the way you do this in NodeJS:

var stuff = require("stuff");
// Or
var stuff = require("./stuff"); // If it's within the same directory, part of a package

Break your big vm into small, maintainable pieces, and if they need to be gathered together into one big thing rather than being used directly, have a vm.js that does that.

So for example

stuff.js:

exports.nifty = nifty;
function nifty() {
    console.log("I do nifty stuff");
}

morestuff.js:

// This is to address your variables question
exports.unavoidable = "I'm something that absolutely has to be exposed outside the module.";

exports.spiffy = spiffy;
function spiffy() {
    console.log("I do spiffy stuff");
}

vm.js:

var stuff     = require("./stuff"),
    morestuff = require("./morestuff");

exports.cool = cool;
function cool() {
    console.log("I do cool stuff, using the nifty function and the spiffy function");
    stuff.nifty();
    morestuff.spiffy();
    console.log("I also use this from morestuff: " + morestuff.unavoidable);
}

app.js (the app using vm):

var vm = require("./vm");

vm.cool();

Output:

I do cool stuff, using the nifty function and the spiffy function
I do nifty stuff
I do spiffy stuff
I also use this from morestuff: I'm something that absolutely has to be exposed outside the module.

Upvotes: 7

Related Questions