若使用 eval 来做类似 import 用途,之后 debug 方式?
发布于 10 年前 作者 grass0916 5409 次浏览 最后一次编辑是 8 年前 来自 问答

由于自己不想过多的程式码挤在同一个档案中,在 stackoverflow 中查询 Node 如何 import 其他的 .js。

多半的解法不外乎就是将这些 .js export.module,然后 require 它。不过因为一些设计考量(我的变数 scope),此法不太适合我。

于是乎我看到了有人使用 eval 完成了我的需求,在当下我明知道 eval === evil 般的恐怖我还是使用了。程式码日益壮大,直到现今的除错讯息真的被 eval 阴了,请见下举例错误讯息:

ReferenceError: userInSession is not defined
    at async.waterfall.getUser.uid (eval at <anonymous> (/Users/Salmon/GitHub/Bounty-Workers/serverSide/web.js:119:9), <anonymous>:88:5)
    at fn (/Users/Salmon/GitHub/Bounty-Workers/node_modules/async/lib/async.js:641:34)
    at Object._onImmediate (/Users/Salmon/GitHub/Bounty-Workers/node_modules/async/lib/async.js:557:34)
    at processImmediate [as _immediateCallback] (timers.js:336:15)

eval at <anonymous> 正常的错误讯息都应该明确指示出呼叫的函数为何者,但只说是 eval 执行的匿名函数(anonymous function)與错误的行数,这将造成开发者大大的困扰啊 …

不晓得各位前辈有没有较好的解决方式呢?

10 回复

module是正道。

@JacksonTian 前辈您好,不晓得您方不方便给予我更多建议?

我举一个例子来描述,一个使用者的帐户系统,有「建立帐户、登入、修改帐户… 等」功能,我想将它们拆分成不同的档案,但都会需要最外层的 express.js 的 module (var app = require(‘express’))才可以使用,但是这些子档案没有取用参数 app 的能力,因为它们的 scope 不相同,这样子该如何处理呢?谢谢您!

express app 在此情形是众多 require 近来的库之一,所以没办法说传入 app 就解决的样子。

隐约间能感觉到你好像在说什么 如果我的回复不正确就无视吧 把你说的最外层的express降级 用application做最外层。。。。

@dayuoba 您好,大概就是这样子

var .... (其他的庫)
var express = require('express');
var app = express();

app.get('/', function(req, res) {
  res.send();
});

app.get('/create', function(req, res) {
  res.send();
});

app.get('/login', function(req, res) {
  res.send();
});

我想要将不同的 app.xxx(…); 依照性质拆分成不同的档案歸類

var router = require('./router.js');
router(application);
//router.js
module.exports = function(application) {
  var expressApp = application.expressApp;
  var otherModules = application.otherMoudles;
  expressApp.get('/', function(req, res) {
  		//use ohtersModules here
		//res.render()
  });  
  
}; 

不知道是不是想要这种。。

@dayuoba 看起来真棒,请问是这样的 application 吗?

var application = {};
application. ... = 其他的庫;
application.express = require('express');
application.expressApp = express();

@dayuoba 真的很谢谢您,我现在立马试试!

回到顶部