JS包管理方案,spm3 发布通告

jopen 10年前

很高兴通知各位,更好用的 spm@3.x 及其源服务 spmjs.io 发布了。

缘起

spm 从第一个版本到现在三年了,从 0.x 到 1.x 再到 2.x,定位上从 Sea.js 配套的打包工具到包管理器,已发生了多次大的改变。

相比于 Sea.js 的简洁通用,spm 的包管理和打包机制一直被社区所诟病(我相信有一万个issue吐槽过它),甚至或多或少阻碍了整个 CMD 社区的发展,这也和我们做生态圈的想法相悖。(可以参考:spm 的困境

这些年接触 nodejs 时,npm 社区的活跃和便利性给我们很大启发。我们(都)希望在自己的工作中能使用优秀的业界模块(而不是自己开发,或用公司的破框架重构一个),所以我们有了 Sea.js,有了 spm,有了 Arale,这些前端模块化的方案和工具都致力于解决一个问题:我们如何可以像 npm 一样方便的组织和调用模块,我们如何最小成本地来使用和贡献业界优秀的模块,我们如何能给开发者提供通用的前端模块化解决方案

spm@2.x 在去年发布之后,对上面的问题做了很多解答。实际上,spm2 解决了大多数问题,它在支付宝和很多第三方企业和个人的项目中良好的运转,实践了很多工程问题(比如样式和模板的集成、内网源)。但是它也有很多问题,比如太多约定,比如暴露给开发者的复杂度,比如不通用……

所以我们需要一个更好的 spm@3.x。( •̀_•́)ง

定位

新的 spm@3.x 从其他包管理方案(browserify、bower、jamjs、component)中汲取了不少优点,在 spm2 的良好基础上,致力于提供一个开放、通用、完善、集成化的基于浏览器模块生命周期的包管理工具,包括初始化、编码、本地化调试、文档生成、发布、依赖管理、单元测试、构建、源服务等等功能。

p1.png

进化

一起来看看 spm@3.x 都发生了哪些变化:

  1. 精心设计的 package 规范。

    • 去除 family 字段。打通模块间依赖的壁垒,避免每个 family 下都发布要 jquery 的问题。
    • spm.alias 属性被语义更加明确的 spm.dependencies 属性代替。
    • 添加了 spm.main 属性,实现了单入口,从而使依赖书写更加清爽。

      原来你需要这么写:

      "alias": {   "moment": "gallery/moment/2.6.0/moment" } 

      现在清晰多了:

      "dependencies": {   "moment": "2.6.0" } 
    • 去掉了默认的 src 目录等约定规则,这样模块目录结构可以像 npm 模块一样简单随意。
    • 新增 buildArgs 字段,用于模块构建。
  2. 编码书写规范从 CMD 规范全面转向 CommonJS,更加通用和开放,不再需要书写烦人的 define(function(require, module, exports) {})了,并且可以和 Component 社区进行一定程度的打通。CMD 格式作为调试和上线后的运行时规范继续存在,但基本上对开发者透明了,我们正在和 CMD 规范告别

  3. 新的命令行工具 spm@3.x,我们将原先的功能、常用插件、和在 apm 中实践出来的通用功能都集成到一起,用于管理一个完整的模块生命周期,包括初始化,完全的本地化调试,测试,发布,构建,文档生成和部署等等功能,All in one。比起其他浏览器包管理工具,功能更加完善贴心,更浏览器,更快(网速:-D)。

  4. 基于 gulp 的构建工具。(spm build)

    • 明显快于 grunt 方式的构建速度。
    • 包管理和构建过程完全分离,源上不存放构建后的代码,发布前不再需要运行 spm build,构建只作为上线前的必要步骤。
    • 简单通用的配置让你告别繁琐的 gruntfile,也不再被各种支付宝潜规则困扰。
    • 支持 standalone 的打包方式,无须 Sea.js 环境也可部署使用
    • 依旧支持 css、tpl、handlebars 等特殊模块的内嵌。
  5. 基于 nodejs 重写的源服务 spmjs.io,用于代替原来用 python 写的 yuan,完美适配 spm@3.x,支持 github 登陆和匿名两种方式,可以很方便部署(适合作为企业级开发的内网源),同时方便了我们的后续维护。我们已部署了一个 spmjs.io 作为通用的全网服务。

  6. 高端大气的界面以及……英文文档!我们要更加国际化。

    p2.png

  7. 大量细节变化不一一絮述。

使用

好吧,正式的用起来吧!

安装

$ npm install spm -g

会覆盖 spm2,需要共存的请参考spm 2, 3 共存方案

确保你安装的是 3.x 版本:

$ spm -V  3.0.x

开始试用

直接看官网的上手文档吧:spmjs.io/documentation

不要担心英文,这些文档都是中国人写的:-D

参与

我们衷心的希望您能一起参与到新版 spm 的开发和使用中来,你可以从以下几个方面入手:

  1. 迁移旧的模块。

    如果您在使用老的源服务 https://spmjs.org,建议进行迁移,可以参考迁移文档 和使用迁移工具。推荐参考已迁移的 Arale 模块如 Base 的结构。

  2. 推广 spm 社区。

    由于新的模块规范通用性和开放性的改变,使我们向国外社区的推广有了可能。我们已经用 pull request 的方式开始向国外的开源项目推广 spm,目前推广效果还算不错,欢迎加入我们的工作。(向开源项目推广 spm 的汇总

  3. 发布你的模块。

    如果你有牛逼好用的前端项目,欢迎引入 spm3,把模块发布到 spmjs.io 上;也可以帮助我们发布一些业界优秀的模块(目前主要是我们团队的几个人在努力的发啊发)。因为去掉了 family,所以 spmjs.io 和 npm 一样,采用占坑的方式管理模块,好名字先到先得欢迎抢注(不要滥用哦)。

  4. 应用。

    在您的个人博客和公司项目中使用 spm3 新方案,能用的东西才会是好东西。遇到任何问题或有什么好想法,及时给我们提建议

备注

  1. 旧版的 spm2 的源服务 https://spmjs.org 将和新版的源共存一段时间(预计至少半年),强烈建议老用户进行迁移。
  2. 由于 spm2 和 spm3 差异巨大,如果贵公司的文档里有安装 spm2 的文档,请及时修改为npm install spm@2.x -g

相关链接:

来自:https://github.com/spmjs/spm/issues/819