Skip to content

请问spm只适合构建web组件模块吗? #137

Open
@stoneChen

Description

@stoneChen

RT
业务模块怎么办?也得像写一个组件一样,依次spm init,spm build,spm publish吗?
如果不使用spm打包,仅仅使用seajs和seajs-wrapper插件,业务模块都是commonJS规范的模块,没问题,页面功能都可以跑,但是不打包上线,已经不符合现代网站的趋势了。
说一下我当初使用spm2.x的构建流程:
去年spm3还没发布,摸索了很久,为了使构建后的模块ID和加载路径一致(否则factory不执行),几经折腾发现了idleading这个打包参数,最终完成打包任务。
web组件的确是像官方推荐的那样依次spm init,spm build,spm publish,并搭建了私有spm源服务器用以管理这些模块。
但是业务模块并没有发布到spm服务器上,只是和项目代码放在一起,比如a.com/assets/scripts/app/user/new.js 这样的路径(也没有使用spm init,外表看来只是一个普通的js文件)。
开发时,业务模块都是CMD模块,运行没有问题。
当开发完毕后,打包,在scripts/目录下运行一条命令(比如sh build.sh,一个命令别名).
它的流程是,首先,利用nodejs的fs模块,遍历出该目录下所有需要打包的js文件,最后生成package.json,将上述的js列表写入spm.output数组(比如其中一个是app/user/new.js)。
然后调用 spm build -O _spmout,此时package.json中的idleading已指定为/assets/scripts/_spmout/,最后打包出来的模块ID类似于/assets/scripts/_spmout/app/user/new。
当然,页面上seajs.use的路径也要相应添加一层_spmout/.
也就是说,运行一条命令就可以把所有CMD业务模块打包输出到另一个目录下,页面seajs.use的路径切换到该目录即可。或者可以勉强理解为,我把所有业务模块作为一个“组件”里的模块,build时一起打包了。

spm2.x的idleading默认是{familyname}/{version},随着组件的不断升级,版本号也随着升级,即增量发布。
而我这个idleading方案,没有做增量发布(要做也可以,只要每次build的时候,给idleading添加版本号后缀即可,页面引用也相应更改)。我不知道我这样的做法是不是属于hack,但它的确可行。
但是如果业务模块也像web组件那样编写,我想我会crazy掉。

看到spm3发布了,我也是很兴奋,打算“炮制”一份spm3的打包版本,依然找到了buildArgs中的idleading,设置它,发现构建后的模块依赖数组中的依赖模块idleading全都是这个设置值了。。。
这就没法玩了啊~~~

先不讨论spm3的idleading这个行为是不是bug,我只想请问,如何“正确”使用spm对业务模块打包?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions