Лучший способ потребовать несколько модулей в NodeJS - PullRequest
15 голосов
/ 01 сентября 2011

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

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

Это не совсем СУХОЙ.На скромном сервере CoffeeScript требуемый танец занимает большую часть всего сценария!Я играю со следующей альтернативой:

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

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

Ответы [ 3 ]

5 голосов
/ 01 сентября 2011

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

global[id] ?= require name for id, name of {
    "connect", "express", "redis", "sys", coffee: "coffee-script", "fs" }

                                                                    <sup>[<a href="http://coffeescript.org/#try:global%5Bid%5D%20%3F%3D%20require%20name%20for%20id%2C%20name%20of%20%7B%0A%20%20%20%20%22connect%22%2C%20%22express%22%2C%20%22redis%22%2C%20%22sys%22%2C%20coffee%3A%20%22coffee-script%22%2C%20%22fs%22%20%7D" rel="nofollow noreferrer">Compile to JS</a>]</sup>

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

eval "#{id} = require(#{JSON.stringify name})" name for id, name of {
    "connect", "express", "redis", "sys", coffee: "coffee-script", "fs" }

                                                                    <sup>[<a href="http://coffeescript.org/#try:eval%20%22%23%7Bid%7D%20%3D%20require(%23%7BJSON.stringify%20name%7D)%22%20name%20for%20id%2C%20name%20of%20%7B%0A%20%20%20%20%22connect%22%2C%20%22express%22%2C%20%22redis%22%2C%20%22sys%22%2C%20coffee%3A%20%22coffee-script%22%2C%20%22fs%22%20%7D" rel="nofollow noreferrer">Compile to JS</a>]</sup>
4 голосов
/ 12 ноября 2011

Я поиграл с этой идеей некоторое время назад, и в итоге получил следующее:

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 голосов
/ 01 сентября 2011
global[lib] = require lib for lib in "connect,express,redis,sys,coffee-script,fs".split ','
...