这个字符串语法在javascripts中意味着什么?
What's this string syntax means in javascripts?
我目前正在尝试自己学习 node js,而且我对 javascript 也是全新的。当我尝试阅读和理解猫鼬时,我发现了这段代码,没有任何解释。
在router.js
中:
var url = require('url');
var fs = require('fs');
exports.get = function(req, res) {
req.requrl = url.parse(req.url, true);
var path = req.requrl.pathname;
if (/\.(css)$/.test(path)){
res.writeHead(200, {'Content-Type': 'text/css'});
fs.readFile(__dirname + path, 'utf8', function (err, data){
if (err) throw err;
res.write(data, 'utf8');
res.end();
});
} else {
if (path === '/' || path === '/home') {
require('./controllers/home-mongoose').get(req, res);
} else {
require('./controllers/404').get(req, res);
}
}
}
首先,这是什么exports.get
?我有点理解 exports = function functionA(){}
意味着当我可以做这样的事情时:
var router = require('path/router.js');
router.functionA();
但我不明白你这样做是什么意思 exports.get
。
其次,/\.(css)$/.test(path)
。我不明白这个表达式语法,任何人都可以向我解释一下吗?谢谢
这与您认为的不同:
exports = function functionA(){}
您必须设置 module.exports
,而不是 exports
。此外,您可以将其与:
一起使用
var router = require('path/router.js');
router();
因为你设置的是整个导出,而不是一个叫functionA
的属性。
但是,您可以只设置 exports
的属性:
exports.get = function functionA(){}
之所以这样工作,是因为在模块的设置过程中有一个 var exports = module.exports = {}
,而 module.exports
是最后导出的内容。
像这样设置属性意味着当你需要模块时,你可以使用那个 属性:
var router = require('path/router.js');
router.get();
你的第二个问题指向使用正则表达式的一行。我建议对它们做一些研究或者问第二个问题,如果你想理解那个特定的,但是在 Javascript 中,你可以通过用斜杠 (/
) 包围它们来编写文字正则表达式,就像文字字符串一样被引号包围 ("
/'
).
/\.(css)$/
是一个正则表达式,它的作用是检查给定的 path/file 扩展名是否为“.css”.
javascript中有两种构造正则表达式的方法:
使用正则表达式:var reg = /[a-b]/;
或者使用构造函数var reg = new RegExp("[a-b]");
您可以阅读有关正则表达式的更多信息here
关于第一个问题,因为@Aaron Dufour 已经解释过了,我相信他 ;)
First of all, what is this exports.get
? I kind of understand that exports = function functionA(){}
means that when I can do something like this :
var router = require('path/router.js');
router.functionA();
exports = function functionA(){}
其实并没有按照你的想法去做
在 Node 中,exports
只是一个最初引用 Object
的变量。并且,该行正在该对象上设置 get
property/method。
console.log(exports); // {}
exports.get = function () {};
console.log(exports); // { get: function () {} }
exports
引用的对象通常与 require()
returns 引用 module/file.
的对象相同
// `router` = `module.exports` from `./path/router.js`
var router = require('./path/router');
router.get()
有关 exports
的更多信息,请通读 Node.js
的 Modules documentation
Second, /\.(css)$/.test(path)
. I don't get this expression syntax, anyone can explain it to me ?
表达式的第一部分 /\.(css)$/
是 RegExp literal。
/
是开始和结束分隔符,其行为类似于字符串文字周围的引号。并且,在它们之间,\.(css)$
是正在定义的模式。
\. // match a single period character
// escaped to disable the period's "any character" meaning
(css) // match the 3 characters, "css", within a capture group
$ // anchor the pattern to the end of the line/string
表达式也可以用 RegExp
构造函数写成:
new RegExp("\.(css)$").test(path) // note the extra escape needed for the string
1) exports
对象只是一个对象,您可以使用它使一个文件中的代码可用于其他地方的代码。因此,在您的情况下,exports.get
只是定义了一个名为 "get" 的 属性,而这个 属性 恰好是一个函数。要全面了解 Node.js 模块格式,see here。
2) /\.(css)$/.test(path)
相当于说 "hey, look at the variable "path" 并查看它是否以 ".css" 结尾。有关 .test
的更多信息 see here.
我目前正在尝试自己学习 node js,而且我对 javascript 也是全新的。当我尝试阅读和理解猫鼬时,我发现了这段代码,没有任何解释。
在router.js
中:
var url = require('url');
var fs = require('fs');
exports.get = function(req, res) {
req.requrl = url.parse(req.url, true);
var path = req.requrl.pathname;
if (/\.(css)$/.test(path)){
res.writeHead(200, {'Content-Type': 'text/css'});
fs.readFile(__dirname + path, 'utf8', function (err, data){
if (err) throw err;
res.write(data, 'utf8');
res.end();
});
} else {
if (path === '/' || path === '/home') {
require('./controllers/home-mongoose').get(req, res);
} else {
require('./controllers/404').get(req, res);
}
}
}
首先,这是什么exports.get
?我有点理解 exports = function functionA(){}
意味着当我可以做这样的事情时:
var router = require('path/router.js');
router.functionA();
但我不明白你这样做是什么意思 exports.get
。
其次,/\.(css)$/.test(path)
。我不明白这个表达式语法,任何人都可以向我解释一下吗?谢谢
这与您认为的不同:
exports = function functionA(){}
您必须设置 module.exports
,而不是 exports
。此外,您可以将其与:
var router = require('path/router.js');
router();
因为你设置的是整个导出,而不是一个叫functionA
的属性。
但是,您可以只设置 exports
的属性:
exports.get = function functionA(){}
之所以这样工作,是因为在模块的设置过程中有一个 var exports = module.exports = {}
,而 module.exports
是最后导出的内容。
像这样设置属性意味着当你需要模块时,你可以使用那个 属性:
var router = require('path/router.js');
router.get();
你的第二个问题指向使用正则表达式的一行。我建议对它们做一些研究或者问第二个问题,如果你想理解那个特定的,但是在 Javascript 中,你可以通过用斜杠 (/
) 包围它们来编写文字正则表达式,就像文字字符串一样被引号包围 ("
/'
).
/\.(css)$/
是一个正则表达式,它的作用是检查给定的 path/file 扩展名是否为“.css”.
javascript中有两种构造正则表达式的方法:
使用正则表达式:
var reg = /[a-b]/;
或者使用构造函数
var reg = new RegExp("[a-b]");
您可以阅读有关正则表达式的更多信息here
关于第一个问题,因为@Aaron Dufour 已经解释过了,我相信他 ;)
First of all, what is this
exports.get
? I kind of understand thatexports = function functionA(){}
means that when I can do something like this :var router = require('path/router.js'); router.functionA();
exports = function functionA(){}
其实并没有按照你的想法去做
在 Node 中,exports
只是一个最初引用 Object
的变量。并且,该行正在该对象上设置 get
property/method。
console.log(exports); // {}
exports.get = function () {};
console.log(exports); // { get: function () {} }
exports
引用的对象通常与 require()
returns 引用 module/file.
// `router` = `module.exports` from `./path/router.js`
var router = require('./path/router');
router.get()
有关 exports
的更多信息,请通读 Node.js
Second,
/\.(css)$/.test(path)
. I don't get this expression syntax, anyone can explain it to me ?
表达式的第一部分 /\.(css)$/
是 RegExp literal。
/
是开始和结束分隔符,其行为类似于字符串文字周围的引号。并且,在它们之间,\.(css)$
是正在定义的模式。
\. // match a single period character
// escaped to disable the period's "any character" meaning
(css) // match the 3 characters, "css", within a capture group
$ // anchor the pattern to the end of the line/string
表达式也可以用 RegExp
构造函数写成:
new RegExp("\.(css)$").test(path) // note the extra escape needed for the string
1) exports
对象只是一个对象,您可以使用它使一个文件中的代码可用于其他地方的代码。因此,在您的情况下,exports.get
只是定义了一个名为 "get" 的 属性,而这个 属性 恰好是一个函数。要全面了解 Node.js 模块格式,see here。
2) /\.(css)$/.test(path)
相当于说 "hey, look at the variable "path" 并查看它是否以 ".css" 结尾。有关 .test
的更多信息 see here.