Skip to content
This repository has been archived by the owner on Aug 15, 2018. It is now read-only.

SPM 发布 0.9.0 试用版 #186

Closed
leoner opened this issue Aug 3, 2012 · 86 comments · May be fixed by Mattlk13/spm#24
Closed

SPM 发布 0.9.0 试用版 #186

leoner opened this issue Aug 3, 2012 · 86 comments · May be fixed by Mattlk13/spm#24

Comments

@leoner
Copy link
Contributor

leoner commented Aug 3, 2012

目前 SPM 经过重新设计和开发,已经发布了最新稳定版:

https://npmjs.org/package/spm

当前版本主要功能还是为了满足支付宝的应用场景,但是设计的时候也考虑到了一定通用性。

对外部用户的使用场景可能支持得还不是很好,欢迎大家提供自己的使用场景,并提出宝贵的意见。

SPM 1.0.0 会根据收集上来的使用场景和需求进行完善。感谢大家。

@afc163
Copy link
Member

afc163 commented Aug 3, 2012

spm server 的应用场景是?貌似和nico server功能重复了

@antife-yinyue
Copy link

dependencies 的作用是啥?依赖不是可以从代码分析出来么?
以前的 exclude 呢?

@hellolibo
Copy link

我们使用ant 项目的build.xml中已经使用了很多配置,项目名称这些东西,发布路径等等,如果再使用package.json,显得重复。

是不是每个项目都需要定义这样的json,是否可以考虑像jshint那样,可以在命令中增加一个选项是通用配置文件的路径,这样可以把一些通用的项目定义在那里。

@leoner
Copy link
Contributor Author

leoner commented Aug 3, 2012

@jsw0528 dependencies的场景是这样的,就是我们在源代码中:

    var $ = require('$');
    var _ = require('underscore');

就是在代码中我们并不依赖某个模块的某个版本,而且写起来也会很简洁, 然后我们可以在配置文件中:

dependencies: {
    "$": "jquery/1.7.2/jquery",
    "_": "underscore/1.0.1/underscore"
}

这样我们会在最终输出的文件中对这些依赖替换成具体的版本.

@leoner
Copy link
Contributor Author

leoner commented Aug 3, 2012

@hellolibo
我们的配置文件是可以继承的,具体的继承规则是按照目录继承的,也就是说如果在模块父目录中发现package.json,那么这个配置文件的内容会被继承下来的。

@antife-yinyue
Copy link

@kangpangpang 不是有 seajs.config 么

@leoner
Copy link
Contributor Author

leoner commented Aug 3, 2012

@afc163 spm server主要是提供源服务。

@leoner
Copy link
Contributor Author

leoner commented Aug 3, 2012

@jsw0528 这样的,有这么一个场景,如果我有一个组件A本来是在jquery/1.6.2测试是没有问题的,然后我新开发一个组件B,如果我这个组件是基于jquery/1.7.2的,那么如果我们对于$的解析全都放入到seajs.config中,那么就可能会有一些潜在的风险。因为我的组件A并不一定保证在1.7.2上可以运行. 所以我们允许用户提前把模块具体的版本提前解析出来,但是如果用户的dependencies配置为

    dependencies: {
        "$": "$"    
    }

那么也是可以把$的解析有页面使用者来决定.

@antife-yinyue
Copy link

@kangpangpang 这样的话,A、B 两个组件是不能同时使用的?如果是这样,用 seajs.config 也能在打包时拿不同的 JQ 啊。

另,如果我不配置 dependencies,打包结果会怎样?

还有我第二个问题,以前的 exclude 怎么实现?

@leoner
Copy link
Contributor Author

leoner commented Aug 3, 2012

@jsw0528 目前是可以同时使用的,因为目前每一个组件的依赖都是明确的,而且会把所有的依赖都解析出来. 而且每一个组件都运行在闭包中,也是不会冲突的.
如果你明确的想对有些依赖比如**$**推迟到页面解析,那么这个由使用者自己来保证.

第二个问题,如果你的项目里面没有依赖类似$, underscore, widget等这些全局模块,依赖都是模块内部的文件,则没有问题。dependencies只是用来解析诸如$, _, widget这些全局模块来用的.

目前没有exclude这个选项, 目前合并文件的时候,可以自己指定要合并那些模块。

    output: {
        "moduleA.js": ["moduleA.js", "b.js", "c.js"]
    }

@antife-yinyue
Copy link

@kangpangpang 在开发阶段呢?不是 spm 还没介入么?此时只有 seajs.config,咋办?

觉得新 spm 的合并策略没旧版灵活啊,seajs 的优点就是能自动管理依赖,现在打包的时候却要明确知道依赖哪些模块

@leoner
Copy link
Contributor Author

leoner commented Aug 4, 2012

@jsw0528 在开发阶段还和原来一样啊,并不要求必须把模块打包后,才能进行调试,我们还是可以通过使用:

// and its friends
seajs.config({

    alias: {

        // 外来模块
        '$': 'jquery/1.7.2/jquery',
        'jquery': 'jquery/1.7.2/jquery',
        'zepto': 'zepto/0.9.0/zepto',
        'underscore': 'underscore/1.3.3/underscore',
        'json': 'json/1.0.2/json',
        'handlebars': 'handlebars/1.0.0/handlebars',
        'moment': 'moment/1.6.2/moment',
        'async': 'async/0.1.18/async',
        'store': 'store/1.3.3/store',
        'swfobject': 'swfobject/2.2.0/swfobject',
        'backbone': 'backbone/0.9.2/backbone',
        'jasmine': 'jasmine/1.1.0/jasmine-html',

spm并没有改变原来的开发习惯,他只是提供了一种打包的策略。

关于依赖的处理是这样的,因为支付宝的场景有点不太一样,我们对组件的稳定性比较看重,所以我们目前每一个模块打包后所有的依赖必须是完备的,就是说他依赖的每一个模块的版本是固定的,是不能通过页面中seajs.config来改变依赖的模块的。 但是你说的那种情况还是说期望对于像jquery, underscore这些还是希望通过seajs. config 来具体的进行映射的话,应该也是可以做到的。我后续增加下这个功能.

目前合并策略还是比较灵活的

 "output": {
        "a.js": ".", // 相当于把 a 的所有相对依赖打包成一个文件
        "a-aio.js": "*",  // 相当于把所有依赖模块打包成一个文件
        "d.js": ["d.js"]
    },

应该可以满足大部分场景了,不知道你的场景是什么样子?

@antife-yinyue
Copy link

@kangpangpang 感谢耐心回复!

我说的都是基于业务代码的,并不是一个通用组件。
现在感觉 spm 的 dependencies 和 seajs.config 重复了,我需要维护两块地方。

如果我想把所有依赖打包,但不包括某些模块,咋办?

@leoner
Copy link
Contributor Author

leoner commented Aug 4, 2012

@jsw0528 关于依赖合并排除,目前是不支持的!但是不知道排除某些模块是指全局模块,还是组件内的模块?

对于是否重复这个看具体的开发过程了!目前我们的场景也还好,不用维护两个地方,seajs.config只是用来解析需要在页面中确定的依赖。

@antife-yinyue
Copy link

@kangpangpang 随便排除什么,但一般是JQ之类的。

不用维护两个地方?那比如我的代码是依赖JQ的,那是在 spm 配置,还是在 seajs.config?

@leoner
Copy link
Contributor Author

leoner commented Aug 4, 2012

@jsw0528 我们目前的做法是这样的,对于组件,如果明确的依赖jquery1.7.2,那么就写在package.json中,如果有些通用组件,对于具体依赖jquery版本不在乎, 或者允许把$不仅可以映射为jquery还可以是zepto,那么我们可以把配置放到seajs.config中。

如果对于在开发调试的时候,我们后续可以通过package.json中的dependencies生成seajs.config。

目前排除这个目前我们还没有应用场景,后续的话可以看看如何进行支持.

@antife-yinyue
Copy link

@kangpangpang 希望加上排除功能,我会打包全部依赖,但不包括JQ,JQ会和sea.js一起全站缓存。

从package.json生成seajs.config,怎么搞?

现在是不是只有才开发时才需要seajs.config,打包后,id都会换成绝对路径?

@leoner
Copy link
Contributor Author

leoner commented Aug 4, 2012

@jsw0528 最后一个问题可以参看下 #151

前面两个问题会考虑下,看看有没有更好的方式来实现。

@leoner
Copy link
Contributor Author

leoner commented Aug 4, 2012

@jsw0528 关于排除功能可以看下 #187

@antife-yinyue
Copy link

@kangpangpang #151 都是在说生态圈模块,他们有一个相对固定的目录结构,打包后的 id 都是基于 seajs 的 base 路径。
如果是业务代码,目录结构是不固定的,那生成的 id 是什么样的?http 开头的全路径?(目前没电脑,还没亲测)

能指定输出目录名么?我这边有个需求是打包后的 JS 有个版本控制,就是存放在不同 release 目录。这样如果 id 是 http 开头的全路径,那么在打包的时候就应该把 release 号码也替换进去。

@leoner
Copy link
Contributor Author

leoner commented Aug 5, 2012

@jsw0528 对于业务代码我们的id是: alipay/contacts/1.0.0/contacts. 然后在页面中我们会

       alias: {
          '~'         : 'https://a.alipayobjects.com',
          'arale'     : 'https://a.alipayobjects.com/static/arale',
          'alipay'    : 'https://a.alipayobjects.com/static/alipay'
        }
    });

对alipay首先进行映射, 然后id也会拆分成目录,找到对应的模块.

目前输出我们是默认项目的dist目录。但是我们目前支持生成的模块上传到我们的源服务, 然后也可以把对应的文件自动scp到测试服务器上.

@antife-yinyue
Copy link

@kangpangpang 上面的配置是在 seajs.config?

不过还是不能满足我的需求啊,最好还是能自定义输出目录,release 号是项目部署时自动生成的,我能获取到,然后再用于 spm build。

目录结构:
开发时:项目/src/a.js
部署后:项目/release/a.js

@leoner
Copy link
Contributor Author

leoner commented Aug 6, 2012

@jsw0528 恩,是在页面的seajs.config中

关于输出目录目前默认是dist, 近期会支持源代码和打包后的目录自定义.

@renhao
Copy link

renhao commented Aug 6, 2012

今天琢磨了一天,spm还是不太好用。API有些没看明白。

如下目录结构:

package.json
README.md
index.html
src/
      seajs/
          1.2.0/
                sea.js 
      jquery/
          1.7.2/
                jquery1.7.2.js
      json/
          1.0.1/
                json.js
      boot.js
      a.js
      b.js 
      c.js
dist/

index.html :

<script type="text/javascript" src="src/seajs/1.2.0/sea.js" data-main="./src/boot.js"></script>

<script>
seajs.use("./src/a.js");
</script>

boot.js:

seajs.config({
    alias : {
        'jquery' : 'jquery/1.7.2/jquery1.7.2',
                'json' : 'json/1.0.1/json'
    } , 
    preload: [] ,
    debug : false , 
    map : [] ,
    charset : 'utf-8'
});

a.js

define(function(require, exports, module) {
    var b = require('./b');
    var c = require('./c');   
})

b.js

define(function(require, exports, module) {
    var Json = require('json');
})

c.js

define(function(require, exports, module) {
    var $ = require('jquery');    
})

请问这个场景下,打包配备文件package.json要怎么写,我试了多次都失败。
package.json

{
    "name" : "app" , 
    "version" : "1.0.0" ,
    "dependencies" : {
                   //这里要如何写依赖关系?
    }, 
    "output" : {
        "a.js": "."        
    }
}

然后,请问spm能否向Ant那样,支持文件复制,文件删除?
比如:我开发场景引用的是 src里的文件,打包完成后,index.html要改成引用dist打包后的文件。但src中会有一些类库不用压缩,也没有output到dist里。如果此时引用 dist里的某文件,这个文件之前又依赖了src里的文件,此时就找不到对应文件了。

@antife-yinyue
Copy link

@kangpangpang lib/actions/build/core/sources.js 73行,'Did not find the modules' 最后加个空格

建议加个引号:'Did not find the module "' + moduleId + '" you need'

@antife-yinyue
Copy link

@kangpangpang 现在打包必须架个源啊?

感觉以前 spm build 的功能,一个都没兼容下来啊 😭

搞了半天 SPM,结论是得等你这周的成果啊~加勒个油啊~

@leoner
Copy link
Contributor Author

leoner commented Aug 6, 2012

@jsw0528 目前源已经默认为[http://modules.seajs.org/], 目前里面的模块还在增加中。应该可以满足基本的需求.
重新安装SPM即可. (需要清空~/.spm目录)

@antife-yinyue
Copy link

@kangpangpang 非得基于 http 么?这样就必须在线啊。而且我本地是有依赖的文件的。

能判断路径么,以支持本地路径。

我所需要的依赖,未必 modules.seajs.org 有啊

@antife-yinyue
Copy link

@kangpangpang 现在 package.json 的 version 是必选项,但业务代码没这东西啊。

按照目前的打包策略,我把我的目录结构改成:项目XXX/src/a.js,我希望打包后是:项目XXX/{{release}}/a.js

这里的 release 也可以理解为 version,希望能在执行 spm build 时自定义输出路径:
cd path/to/项目XXX
spm build --out-dir ./{{release}}/

@antife-yinyue
Copy link

@kangpangpang 想来想去,还是觉得打包时解析依赖关系靠 package.json 的 dependencies 不是很方便。因为开发时只能从 seajs.config 拿数据,就算能自动生成,那总不能每次改完 package.json 再手动执行某个命令吧?

@antife-yinyue
Copy link

@kangpangpang @lepture 感谢两位!

刚发现个问题,我 src 里有 a.js 和 b.js 两个文件,但 package.json 的 output 只配置了 { 'a.js': '*' },结果运行 spm build -X 后出现 PORCESS MODULE b.js ...

@antife-yinyue
Copy link

~/.spm/sources/modules.seajs.org/jquery/1.7.2/ 结构:

jquery.tgz
dist/
  jquery-debug.js
  jquery.js
jquery/
  dist/
    jquery-debug.js
    jquery.js

是不是多了点东西?

spm build 后生成的 build/_tar/目录是干嘛用的?

@leoner
Copy link
Contributor Author

leoner commented Aug 7, 2012

@jsw0528 是的jquery目录没有删除。

@lepture
Copy link
Contributor

lepture commented Aug 7, 2012

@jsw0528 出来的结果是这样的?我只有一个 tgz 包呢。 @kangpangpang this is a bug.

@leoner
Copy link
Contributor Author

leoner commented Aug 7, 2012

@jsw0528 关于出现PORCESS MODULE b.js 出现这个是因为在build时候会对所有src下面的代码进行预处理。

@leoner
Copy link
Contributor Author

leoner commented Aug 7, 2012

@renhao 谢谢你的建议,对于一些设计思想会逐步整理出来的。 然后你可以到 https://github.com/aralejs/widget 去把这个代码下载下来,然后试试是否可以打包。

@antife-yinyue
Copy link

@kangpangpang 我把 sources 目录删了也是这样,多了个 jquery 目录

预处理?没这个必要吧?既然我都没配置,干嘛要处理?万一我的 b.js 还没开发完,或者还没把依赖写进 package.json,这样会影响 a.js 的打包啊~

@renhao
Copy link

renhao commented Aug 7, 2012

@kangpangpang
谢谢两位了,今天麻烦了。下载了,还是会出现

Caught exception: Error: Did not find the modules handlebars\1.0.0\handlebars you need

可能是我机器的问题,我晚上换台电脑试试。

@leoner
Copy link
Contributor Author

leoner commented Aug 7, 2012

@jsw0528 是的,jquery目录应该在解压完成后,删除掉,这个是SPM的问题,下一个版本会fix掉。

关于预处理这块,由于这个build过程是分为多个阶段的,每一个阶段会做相应的事情。比如在合并之前我是首先会对每个模块进行分析,计算相应的依赖关系,然后在进行合并处理,如果不进行处理的话,那逻辑就变成我首先要分析ouput里面的内容,而且还有去解析b.js他的依赖,看看他是否依赖a.js,然后在决定是否对a.js进行处理,这个过程就有点复杂了。

@antife-yinyue
Copy link

@kangpangpang

如果 HTTP HEAD 404 http://modules.seajs.org/iscroll/4.2.0/iscroll.tgz,那怎么可能 spm build自动会产生.tgz,不能 {{base}}/module/version/module.js

spm build 后生成的 build/_tar/目录是干嘛用的?

@leoner
Copy link
Contributor Author

leoner commented Aug 7, 2012

@jsw0528 关于404实际上由于用户可以配置多个源,模块可能存在任意源上,所以目前是一种探测机制,去查看需要的模块在那个源上,后续这个404日志会清楚掉。 不太清楚后面的那句,为什么不太可能spm build 会自动产生.tgz

spm build后, build目录应该是会被清除掉的,没有删除掉应该是打包失败了吧。 _tar是为了打tgz包时候,构建的一个临时目录.

@antife-yinyue
Copy link

@kangpangpang

我是说 jquery/1.7.2/jquery/dist/jquery/1.7.2/dist/ 有一个是多余的。

有了这个预处理过程,打包时就得保证 src 目录里的所有文件都是成品啊。

spm build 后提示 BUILD SUCCESS!。难道是权限问题,需要 sudo

spm build自动会产生.tgz 是引用自你说的话。如果我所需的依赖不在 modules.seajs.org,我又没架私源 server,我只是把 js 文件放在了 seajs-modules 目录,那就没有 tgz 包啊,只能再手动压缩啊。难道还需要个 spm tar {{module}} ?

@leoner
Copy link
Contributor Author

leoner commented Aug 7, 2012

@jsw0528 有一个是多余的就是第一个。这个是应该被自动删除掉的,下一个版本会处理掉啊!

关于预处理这块其实就是看看这个模块依赖了那些东西,需不需要我去服务器下载点东西,内部require的模块应该也是需要是一个标准的模块。这个先不用纠结了,后续会灵活处理的。

提示SUCCESS 有什么问题? 这个是说明打包成功了.

关于本地源这个,我在#199里面已经提了。tgz只是用于和sources沟通的载体,对用使用者是透明的。

@antife-yinyue
Copy link

@kangpangpang

提示 BUILD SUCCESS!,说明我打包成功了,但 build/_tar/ 没删掉

目前可预知的需求都已经递交给你了,加勒个油吧~ ⛽

0.9.5 大概什么时候发布?

@leoner
Copy link
Contributor Author

leoner commented Aug 7, 2012

@jsw0528 大概17号吧!

@BANG88
Copy link

BANG88 commented Aug 8, 2012

@kangpangpang 我这边遇到的问题跟 @renhao 一样,Windows下面。 着急,文档太少,都在ISSUES里面,每个API都要亲自去试才知道做了些什么。。
我在本地配置了一个源,build 的时候看了下日志,不知道是不是因为多了一个“/”才会找不到模块的?

httpGET: /
httpGET: /favicon.ico
httpHEAD: //jquery/1.7.2/jquery.tgz
httpHEAD: //jquery/1.7.2/jquery.tgz
httpHEAD: //jquery/1.7.2/jquery.tgz
...

@renhao
Copy link

renhao commented Aug 8, 2012

@kangpangpang @arbang
windows下问题确实不少,具体什么原因还是没弄清楚,我64位系统,我还是先用Ant吧。
期待v1.0大版本。

@leoner
Copy link
Contributor Author

leoner commented Aug 8, 2012

@arbang @renhao 我在xp上都测试过了,没有发现啥问题。本周会对windows平台下的问题在梳理下,本周会重新发布一个新的版本.

@arbang 你把你用户目录下面的.spm目录删除,然后重新在build下,如果你只需要jquery应该不用本地搭建源。

@BANG88
Copy link

BANG88 commented Aug 8, 2012

@kangpangpang 我把源设置为官方的源,也一样不行。
刚只是先拿jquery 来试试,我们有些模块也是几个系统共用的,so...

@leoner
Copy link
Contributor Author

leoner commented Aug 8, 2012

为了方便及时更好的回答和解决大家的问题,大家可以把自己的问题单独提一个issue. 就不在这里统一回答了啊!

@leoner leoner closed this as completed Aug 8, 2012
@ganksolo
Copy link

ganksolo commented Aug 9, 2012

我是来占座的。

@crossai-2033
Copy link

唉 感觉Seajs用不起来 这个部署工具拖后腿啊

@leoner
Copy link
Contributor Author

leoner commented Sep 10, 2012

@Lc2010 如果工具在使用上有什么问题可以提出来的!

@crossai-2033
Copy link

如果是有跨模块通用的脚本. 这样一般解决方案是啥? 如果都提取合并,那么是不是缓存机制就浪费了呢?
还有,这个spm有没有比较入门级的操作文档啊.类似于r.js的那种.现在讨论到处都是.就是没看到一个成功案例.

@crossai-2033
Copy link

是否可以给我发个QQ号之类的.我想具体咨询调研一下.看目前项目是否可用

@lifesinger
Copy link

可以装下阿里旺旺

然后联系 陆辉

建议还是邮件沟通,IM 适合沟通感情,不适合沟通技术问题。

On Thu, Sep 13, 2012 at 2:37 AM, liangchao notifications@github.com wrote:

是否可以给我发个QQ号之类的.我想具体咨询调研一下.看目前项目是否可用


Reply to this email directly or view it on GitHubhttps://github.com/seajs/spm/issues/186#issuecomment-8505142.

王保平 / 玉伯(射雕)
送人玫瑰手有余香

@crossai-2033
Copy link

@lifesinger hi 玉伯. 如果顺利使用上了以后.可以选择用邮件沟通.前期想问的比较多.而且和应用场景相关.所以还是希望能够简单对话.询问一下. 我个人也不建议长期用IM.但开始还是感觉沟通比较快. 而且我还邀请你QQ了.

@luolonghao
Copy link

Hi,一般网站都有自己的URL更新机制,比如,加时间戳,或加数字,a.js?t=123.js,a_1.js 等。看上面讨论,支付宝是业务代码也用member/1.0.0/member方式,如果这样做是不是每次上线代码都要修改版本号?一般的应用场景是业务代码频繁更新,相关依赖代码也要更新,不知道这种场景有什么合适的策略?

比如我们土豆部署后一般只有2个js,tuilib.js(共通)和page.js(具体业务代码),tuilib.js包含共通的业务代码,所以也要频繁更新,更新tuilib.js后要影响page.js。

上线前:

tuilib_1.js
page_1.js

修改tuilib上线后:

tuilib_2.js
page_1.js

如果采用tuilib/1.0.0/tuilib,page/1.0.0/page版本控制,修改tuilib后所有page里的依赖配置都要更新一遍,因为我们希望对所有page代码都有效。

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging a pull request may close this issue.