使用 SeaJs ,构建时如何保证依赖,但不合并?

2013-05-06 17:08:24 +08:00
 xhslyf
有个疑问,首先我的文件结构是 base.js 和 main.js 这样两个文件,base 中存放全站通用的一些方法函数,base 不合并,方便客户端缓存。 main 为每个页面的私有 js 文件。页面两个 seajs.use 入口。

此时,有某几个函数为全站通用,但是参数不同,我通过 exports.abc 的方式在 base 中开出接口,通过 var base = require("./base"); 在 main 中调用,但是构建的时候 grunt 就会把 base 合并到 main 中。

请问有什么办法即可以将方法的代码存于 base 中避免代码重复,同时又可以在 main 中调用到该方法,并且构建时不将 base 合并到 main ?
4422 次点击
所在节点    JavaScript
6 条回复
xhslyf
2013-05-06 17:16:43 +08:00
又或者说,这几个全站通用的函数也封装成独立的模块 .js 文件,然后使用的时候在 main 中 require 进来,构建时合并?
然后 seajs.use 入口就只有一个 main ,彻底不要 base 。虽然会有重复代码,但应该不会太多……
chemzqm
2013-05-06 22:24:14 +08:00
使用Seajs官方的spm https://github.com/spmjs/spm 来打包吧, 可以指定规则。
或者把你的公共函数都放到一个全局变量(或者叫命名空间)下面,然后把它用script标签引入页面就行了。
我个人反对为了模块化而模块化,绝大部分网站不会像支付宝的前端那么复杂,没有必要打包的代码放到全局将来维护也会更容易些。
libo
2013-05-07 10:36:09 +08:00
打包规则中默认是打包相对路径的模块的,如果你的base是通用的,建议在sea-config.js中配置一个alias (配合合理的文件夹及文件放置),比如: alias:{"base","path/to/base.js"} 这样你在使用时直接使用require("base")就可以了,打包时他就不会打包这个文件了
xhslyf
2013-05-13 16:38:32 +08:00
@chemzqm 我使用的是 npm ,利用"Gruntfile"来指定规则,但是还是没搞懂怎么满足我的需求。你的意思是我的 base.js 直接不通过 SeaJs ,自己用 <script> 引入页面,然后按照平常的方法使用?

@libo 如果在 config.js 中指定路径,我想应该是可以的,但是那样的话就无法压缩 base ,而且请 base 中 require 到的模块也不会合并到 base 中了吧?
chemzqm
2013-05-13 17:42:17 +08:00
看了下你的demo,很明显问题在与grunt-cmd-transport这个工具不支持复杂打包方式,我个人觉得如果公共部分不太复杂用script标签可以接受,如果你一定要统一依赖关系的话还是用官方的spm吧
https://github.com/spmjs/spm2, 类似seajs的问题建议你加入 seajs@googlegroups.com 邮件列表在邮件里面提,会很快得到答复的。
xhslyf
2013-05-17 09:06:06 +08:00
@chemzqm 谢谢,我跑去看了下 SPM2 的一个配置示例,然后搞定了。3Q……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/67911

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX