Лучший способ потребовать несколько модулей в 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 ','