-
Notifications
You must be signed in to change notification settings - Fork 2.6k
require 书写约定 #259
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
有任何问题,欢迎留言交流。 |
很不理解,在框架中用到一个动态加载依赖的设计是很正常的,不会是不良设计的根源,不可能要求以后每添加一个模块就要在这里加个else,而其实只要简单传个变量过来就可以做到的,代码也是相当的优雅 |
@nnzbz 那只有等浏览器以后来支持了。 |
我水平面比较低,能讲解一下为什么只能是字符串直接量吗?我好学习一下 |
@nnzbz 看文中的参考文档。 |
@nnzbz 因为在要执行某个模块时,会预加载这个模块中的依赖,里面变量都未执行,所以。。。 |
为什么我写的require("$")返回结果是空的因为jquery.js没有exports,而arale的模块require同一个js是正常的 |
看了《程序员》上关于玉伯 的 模块化开发思想,当时也想到了将函数字符串化,再正则提取。Seajs正是如此,但有许多限制。 |
为什么require来进行条件加载,两个文件就都加载进来了?而require.async只加载进来需要的文件? |
@emilley 这篇文档不就是解释你的问题的? |
@lifesinger 模块构造函数的第一个参数必须用require么?我在2个项目里使用seajs,2.1.0版本,我发现前一个版本将第一个参数写成任何样子都可以,但是第二个项目却不行,第一个参数必须要require才能识别,2.2.1和2.1.0都做了测试,能帮忙解决一下这个疑惑么? |
你看下并理解楼上这篇文档就行了。 包括 #426 |
@afc163 我看过文档了,我看第一个约定就是工厂第一个参数必须为require,我这边不用require也可以应该是什么原因导致的呢?cmd压缩也说要保留require关键字,但是grunt打包没有保留require也一切正常。 |
@afc163 还是没找到答案,提点一两下被 |
|
@afc163 这个我知道,问题是你看我的截图,我没提取id和依赖,没有压缩,依然可以直接使用第一个参数,这是为什么....但是在另一个项目,确实修改require无法正确加载,提取id和依赖后解析正常,我想知道截图这种情况是怎么导致的 |
把 require 改为 e 后,如果也没有提前提取依赖数组的话,seajs 无法提前获取本模块的依赖,就不会去载入 jQuery 和 underscore,这样你的逻辑很可能就跑不通了。 但是如果你在别的代码里 改名后,缺少的只是提前读取依赖的特性。 当然,上面的 |
@afc163 截图这个模块就是整个项目的入口,之前没有定义过jquery之类的东西.....我log打印出来第一个参数,不管是不是require结果都一样,应该不提前获取模块依赖,也可以请求加载吧,问题是现在的项目,修改require就解析错误,exec解析失败,why,好奇怪..... |
不提前获取模块依赖,就不会请求加载。 之前要是没定义过 jQuery 之类的,那么第一个 require 空说无凭,上线上能访问的静态 demo 吧。 |
我估计里面肯定是用了toStrng()把方法里面的require提出来进行模块id解析的,等会去看看源码。 |
比如说我有一个placeholder模块 用来在IE8以下浏览器模拟placeholder |
@iamweilee 那我这种情景 还有办法优化吗 chrome下也要加载这个js了?但是我压根没用它 |
那你就用异步require吧,然后在回调里写业务逻辑,具体你看看seajs的demo |
使用require 火狐浏览器出现卡死的情况,这是我使用的方法不对吗? 出现卡死 |
哇 这么多人回复了! |
这个直接字符串是不是为了用于打包时候的匹配检测啊? |
大神,我想问一个seajs的require 和nodejs的require 的问题。虽然前者是前端,后者是服务器,但是有没有考虑到node-webkit? 如果我在node-webkit 桌面应用项目中用nodejs和seajs 他们的require是不是会冲突? |
@grantSeajs Sea.js 的 |
define("base/easing/1.3.0/easing", ["jquery"], function(require) { |
用require加载一个文件,然后new的时候报错 我的代码是这样的 colorFac文件为是这样的 然后总是报错,gradientColor is not defined。我不清楚这是什么原因,看着colorFac.js文件已经加载了~~ 我想知道这是为啥呢?难道colorFac非得按照seajs的写法写?还是new的时候,colorFac.js文件没加载? |
@helloqinqin 一般不会有这种情况发生,gradientColor is not defined说明全局肯定没有这个类存在,你得先确定库文件内部对外的接口是如何处理的,可能是进行过模块化的兼容,试试gradientColor=require('charts/component/colorFac');获取文件对外的api。还不行的话,确认一下gradientColor类名是否正确 |
@ZLStone 不过没有对colorFac.js用defined模块化。我想着,这个也不能强制要那么写的 |
@helloqinqin 不需要强制写,至少我用的2.1.0不需要,还是文件本身的问题,如果确定加载成功,全局没有,看看文件代码吧... |
@ZLStone 2.我又把colorFac.js按照原来的,并且把gradientColor方法前面的g大写了,还是不行 我的seajs是2.3.0 具体什么原因还得多做实验,才能得出啊 |
这种是不是以后加反射来处理了 |
用$=require('jquery')时,为什么alert($)返回的是null |
希望有大牛帮我解答一下,为什么在safari浏览器下http://www.51go.me/加载的这么慢,是seajs的原因吗,有几个js我是require进来的 |
第一个参数'require',在压缩时候会改名,导致无法正常执行,有什么好的办法吗 |
@xxiiaass 同问 |
IE10 如果用require加载模块会得到结果NULL,这里指的不是jquery,而是项目里面的其他JS文件。 |
require 关键字不压缩或者提前把依赖声明: define('file:///D:/zengxiaoluan/learn_seajs/dist/foo.js', ['file:///D:/zengxiaoluan/learn_seajs/dist/bar.js', 'https://vuejs.org/js/vue.min.js'], function(require, exports, module) {
var bar = require('file:///D:/zengxiaoluan/learn_seajs/dist/bar.js');
new Vue({
el: '#app',
data: {
msg: bar.bar()
}
});
require('https://vuejs.org/js/vue.min.js');
module.exports = 'foo';
}); |
require 书写约定
使用 Sea.js 书写模块代码时,需要遵循一些简单规则。
1. 正确拼写
模块 factory 构造方法的第一个参数 必须 命名为
require
。2. 不要修改
不要重命名
require
函数,或在任何作用域中给require
重新赋值。3. 使用直接量
require
的参数值 必须 是字符串直接量。在书写模块代码时,必须遵循这些规则。其实只要把
require
看做是语法关键字 就好啦。关于动态依赖
有时会希望可以使用
require
来进行条件加载:但请牢记,从静态分析的角度来看,这个模块同时依赖 play 和 work 两个模块,加载器会把这两个模块文件都下载下来。 这种情况下,推荐使用
require.async
来进行条件加载。Why?
这些约定初看起来会有些小不爽,其实也的确可以通过每次都编译的方式来去掉这些限制。但编译的方式,会给开发调试带来麻烦,代码的实现复杂度也会增加。Sea.js 的核心设计原则是保持简单,遵循 New Jersey Approach:
因为简单,所以可靠!
参考文档
The text was updated successfully, but these errors were encountered: