[javascript] node.js는 폴더에 모든 파일이 필요합니까?

node.js의 폴더에 모든 파일이 필요합니까?

다음과 같은 것이 필요합니다.

files.forEach(function (v,k){
  // require routes
  require('./routes/'+v);
}};



답변

폴더 경로가 필요하면 해당 폴더에서 index.js 파일을 찾습니다. 존재하는 경우이를 사용하고 존재하지 않는 경우 실패합니다.

index.js 파일을 만든 다음 모든 “모듈”을 할당 한 다음 간단하게 요구하면 (폴더를 제어 할 수있는 경우) 가장 의미가있을 것입니다.

yourfile.js

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

index.js

exports.something = require("./routes/something.js");
exports.others = require("./routes/others.js");

파일 이름을 모르는 경우 일종의 로더를 작성해야합니다.

로더의 실제 예 :

var normalizedPath = require("path").join(__dirname, "routes");

require("fs").readdirSync(normalizedPath).forEach(function(file) {
  require("./routes/" + file);
});

// Continue application logic here


답변

해당 작업을 수행하기 위해 glob 를 사용하는 것이 좋습니다 .

var glob = require( 'glob' )
  , path = require( 'path' );

glob.sync( './routes/**/*.js' ).forEach( function( file ) {
  require( path.resolve( file ) );
});


답변

@tbranyen의 솔루션을 기반으로 index.js현재 폴더 아래에 임의의 자바 스크립트를로드 하는 파일을의 일부로 exports만듭니다.

// Load `*.js` under current directory as properties
//  i.e., `User.js` will become `exports['User']` or `exports.User`
require('fs').readdirSync(__dirname + '/').forEach(function(file) {
  if (file.match(/\.js$/) !== null && file !== 'index.js') {
    var name = file.replace('.js', '');
    exports[name] = require('./' + file);
  }
});

그런 다음 require다른 곳에서이 디렉토리 를 사용할 수 있습니다 .


답변

또 다른 옵션은 require-dir 패키지를 사용 하여 다음을 수행하도록하는 것입니다. 재귀도 지원합니다.

var requireDir = require('require-dir');
var dir = requireDir('./path/to/dir');


답변

단일 클래스가있는 파일로 가득 찬 폴더 / 필드가 있습니다.

fields/Text.js -> Test class
fields/Checkbox.js -> Checkbox class

fields / index.js에 이것을 드롭하여 각 클래스를 내보내십시오.

var collectExports, fs, path,
  __hasProp = {}.hasOwnProperty;

fs = require('fs');
path = require('path');

collectExports = function(file) {
  var func, include, _results;

  if (path.extname(file) === '.js' && file !== 'index.js') {
    include = require('./' + file);
    _results = [];
    for (func in include) {
      if (!__hasProp.call(include, func)) continue;
      _results.push(exports[func] = include[func]);
    }
    return _results;
  }
};

fs.readdirSync('./fields/').forEach(collectExports);

이를 통해 모듈은 파이썬에서와 같이 더 작동합니다.

var text = new Fields.Text()
var checkbox = new Fields.Checkbox()


답변

또 다른 옵션은 가장 많이 사용되는 패키지의 기능을 필요로하는 모든 기능을 결합한 것입니다.

가장 인기있는 require-dir파일 / 디렉토리를 필터링하는 옵션이 없으며 map기능 이 없지만 (아래 참조) 작은 트릭을 사용하여 모듈의 현재 경로를 찾습니다.

두 번째로 인기 require-all있는 정규 표현식 필터링 및 전처리가 있지만 상대 경로가 없으므로 다음 __dirname과 같이 사용해야합니다 (이점과 반대 점이 있음).

var libs = require('require-all')(__dirname + '/lib');

여기 require-index에 언급 된 것은 아주 최소한입니다.

으로 map당신은 몇 가지 전처리를 수행 할 수 있습니다, 같은 객체를 생성하고 설정 값을 (수출 생성자 아래 모듈을 가정) 통과 :

// Store config for each module in config object properties 
// with property names corresponding to module names 
var config = {
  module1: { value: 'config1' },
  module2: { value: 'config2' }
};

// Require all files in modules subdirectory 
var modules = require('require-dir-all')(
  'modules', // Directory to require 
  { // Options 
    // function to be post-processed over exported object for each require'd module 
    map: function(reqModule) {
      // create new object with corresponding config passed to constructor 
      reqModule.exports = new reqModule.exports( config[reqModule.name] );
    }
  }
);

// Now `modules` object holds not exported constructors, 
// but objects constructed using values provided in `config`.


답변

나는이 질문이 5 세 이상이고 주어진 답변이 훌륭하다는 것을 알고 있지만 표현을 위해 조금 더 강력한 것을 원했기 때문에 express-map2npm 용 패키지를 만들었습니다 . 간단히 이름을 지정하려고 express-map했지만 야후 의 사람들 은 이미 해당 이름의 패키지를 가지고 있으므로 패키지 이름을 바꿔야했습니다.

1. 기본 사용법 :

app.js (or whatever you call it)

var app = require('express'); // 1. include express

app.set('controllers',__dirname+'/controllers/');// 2. set path to your controllers.

require('express-map2')(app); // 3. patch map() into express

app.map({
    'GET /':'test',
    'GET /foo':'middleware.foo,test',
    'GET /bar':'middleware.bar,test'// seperate your handlers with a comma. 
});

컨트롤러 사용법 :

//single function
module.exports = function(req,res){

};

//export an object with multiple functions.
module.exports = {

    foo: function(req,res){

    },

    bar: function(req,res){

    }

};

2. 접두사와 함께 고급 사용법 :

app.map('/api/v1/books',{
    'GET /': 'books.list', // GET /api/v1/books
    'GET /:id': 'books.loadOne', // GET /api/v1/books/5
    'DELETE /:id': 'books.delete', // DELETE /api/v1/books/5
    'PUT /:id': 'books.update', // PUT /api/v1/books/5
    'POST /': 'books.create' // POST /api/v1/books
});

보시다시피, 이것은 많은 시간을 절약하고 응용 프로그램 라우팅을 작성, 유지 관리 및 이해하기 간단하게 만듭니다. 지원을 표현하는 모든 http 동사와 특수 .all()메소드를 지원합니다 .