V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
xhslyf
V2EX  ›  JavaScript

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

  •  
  •   xhslyf · 2013-05-06 17:08:24 +08:00 · 4402 次点击
    这是一个创建于 4009 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有个疑问,首先我的文件结构是 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 ?
    第 1 条附言  ·  2013-05-13 16:41:19 +08:00
    demo:
    https://dl.dropboxusercontent.com/u/18092644/mod.7z

    这个是我的 demo ,其中 js/dist 是构建好的发布版,可以看到里面的 [main] 将被调用到的 [base] [head] [verifica] 全部合并进去了。

    构建前的源文件依赖关系是 [main] 中 require 了 [base] 和 [verifica] ,[base] 中 require 了 [head],那么构建完成后我期望的效果是 [main] 中合并了 [verifica] 的代码,但不合并 [base] 及 [head] 的代码,因为这两块代码是全站复用性很高的代码,每个私有(main)都合并的话代码重复率会很高,但同时也能调用到 [base] 中的方法。

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

    @libo 如果在 config.js 中指定路径,我想应该是可以的,但是那样的话就无法压缩 base ,而且请 base 中 require 到的模块也不会合并到 base 中了吧?
    chemzqm
        5
    chemzqm  
       2013-05-13 17:42:17 +08:00
    看了下你的demo,很明显问题在与grunt-cmd-transport这个工具不支持复杂打包方式,我个人觉得如果公共部分不太复杂用script标签可以接受,如果你一定要统一依赖关系的话还是用官方的spm吧
    https://github.com/spmjs/spm2, 类似seajs的问题建议你加入 [email protected] 邮件列表在邮件里面提,会很快得到答复的。
    xhslyf
        6
    xhslyf  
    OP
       2013-05-17 09:06:06 +08:00
    @chemzqm 谢谢,我跑去看了下 SPM2 的一个配置示例,然后搞定了。3Q……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5453 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 08:52 · PVG 16:52 · LAX 01:52 · JFK 04:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.