Лучший способ потребовать несколько модулей в NodeJS

Мне не нравится стандартный способ требовать модули, который выглядит примерно так:

connect = require 'connect'
express = require 'express'
redis = require 'redis'
sys = require 'sys'
coffee = require 'coffee-script'
fs = require 'fs'

Это не совсем DRY. В скромном CoffeeScript-сервере требуемый танец занимает довольно яркий кусок всего script! Я был toying со следующей альтернативой:

"connect,express,redis,sys,coffee-script,fs"
  .split(',').forEach (lib) -> global[lib] = require lib

Так как я не видел, чтобы люди пытались реорганизовать стандартный подход, я подумал, что спрошу, разумно ли это сделать, и если да, есть ли какие-нибудь лучшие способы сделать это?

Ответы

Ответ 1

Обратите внимание, что coffee-script не является допустимым идентификатором, поэтому ваш код действительно не импортирует его должным образом. Вы можете использовать литературные литералы класса CoffeeScript, чтобы справиться с этим довольно красиво. Я также использовал бы ?=, чтобы избежать ненужного повторного импорта модулей. Создание ответа user211399:

<Предварительно > global [id]? = требует имя для id, имя {    "connect", "express", "redis", "sys", кофе: "coffee- script", "fs" }                                                                    [Скомпилировать JS]

Поскольку я разрешаю вам импортировать разные идентификаторы в разные модули, использование глобального пространства имен кажется особенно опасным. Вместо этого я импортировал их локально, как показано ниже. Имейте в виду, что, поскольку для этого используется eval, он может не сработать изящно, если вы укажете незаконный идентификатор.

<Предварительно > eval "# {id} = require (# {JSON.stringify name})" имя для id, имя {    "connect", "express", "redis", "sys", кофе: "coffee- script", "fs" }                                                                    [Скомпилировать JS]

Ответ 2

Я играл с этой идеей некоторое время назад и в итоге:

global[mod.replace /\W/g, ''] = require mod for mod in [
    "connect"
    "express"
    "redis"
    "sys"
    "coffee-script"
]

Закончился почесывать его и просто делать это обычным способом - это заканчивается тем, что это большая проблема. Существует много раз, когда вам нужно захватить свойство модуля или использовать другую схему именования. Кроме того, присвоение глобальной области не совпадает с "нормальным" require. Выравнивание присвоений облегчает чтение:

connect  = require 'connect'
express  = require 'express'
mongoose = require 'mongoose'
coffee   = require 'coffee-script'
fs       = require 'fs'
{ exec } = require 'child_process'

Вы делаете это только один раз, абстрагируя это просто ненужная сложность.

Ответ 3

global[lib] = require lib for lib in "connect,express,redis,sys,coffee-script,fs".split ','