背景
最近因为学习cocos,发现了一些bug和define有关,于是又研究了一波js的define用法。
网上查了一些相关资料,有些讲的比较细致,有些讲的比较冗余。
参考资料:
https://blog.csdn.net/qq_16633405/article/details/77961539
https://my.oschina.net/heweipo/blog/509554
于是,自己做了一个简单的测试和总结
define用法
define函数遵从于AMD规范,不了解AMD规范的可参考以上第一个链接。
define([name], [dependencies], [callback]);
其中:
name: 模块的名称,可以省略。
dependencies: 所依赖的模块数组,可以省略。
callback : 模块的实现,或者js对象。
例如:
define(["c"],["a","b"],function(a,b){
return {
name: a.name,
age: b.getAge()
}
})
以上定义了一个模块c,其依赖于模块a和模块b,然后返回a的name属性和b的getAge方法
require用法
定义了define模块,需要配合require来在其他脚本中引入define的模块。例如,以上定义的c模块,可以通过以下方式引入:
require( ['c'] ,function (c) {
console.log(c.name);
})
这样就可以在脚本中随意使用c模块的定义函数了。
Node.js中用require引入的坑
我做了一个最简单的demo,来实现define和require
// d.js
define(function() {
return {
name:"zhangsan"
}
});
//TestDefine.js
require(['d'],function(d) {
console.log(d.name);
})
然后,执行node TestDefine.js,发现控制台报错:
path must be a string
这意思是说引入的d模块的path必须是个字符串,我以为是用法[“d”]有问题,于是去掉中括号,改为"d",又报错:
connot find module “d”
查了一番资料才明白过来,原来是因为require是requirejs的语法,在node环境下不能这样用。需要先安装requirejs模块,再引入使用。
参考:https://www.javaear.com/question/41034306.html
使用方法
step1: 执行 npm install requirejs
step2: 修改编码:
// d.js
define(function() {
return {
name:"zhangsan"
}
});
//TestDefine.js
var requirejs = require("requirejs"); //引入requirejs模块
requirejs(['d'],function(d) {
console.log(d.name);
})
至此完美解决问题。