Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(prefix): add options.prefix support #29

Closed
wants to merge 2 commits into from

Conversation

shepherdwind
Copy link

增加options.prefix支持,可以结合koa-mount,在一个server下支持多个serve-spm的运行。

不过没prefix配置支持,那么a组件下有一个index入口文件,b组件也有一个index入口,这样就会冲突了。

@coveralls
Copy link

Coverage Status

Coverage increased (+0.02%) when pulling 596c016 on shepherdwind:master into 332c861 on spmjs:master.

before(function() {
app = server();
app.use(middleware(join(fixtures, 'prefix/simple'), {
prefix: 'simple'
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里在koa可以这么用

app.use(mount('/assets/simple', middleware(dir, { prefix: 'simple' } ));
app.use(mount('/assets/b', middleware(dir, { prefix: 'b' } ));

页面中

seajs.config({
  base: '/assets'
});
seajs.use('simple/index');
seajs.use('b/index');

@sorrycc
Copy link
Member

sorrycc commented Jan 18, 2015

a 组件和 b 组件的 index 分别通过 a/version/index.jsb/version/index.js 访问,这样应该不会冲突。

@shepherdwind
Copy link
Author

@sorrycc 你那种是在spm_modules下面,我这边需要的是一个目录下有两个本地开发的spm组件,现在serve-spm只能执行一次,我需要两个本地组件,同时跑在一个页面的情况

@shepherdwind
Copy link
Author

重新描述一下我的需求吧。

在一个路径下,有多个开发中的spm组件,页面是spm组件构成的,所以在同一个页面中会引入本地多个组件。目录结构如下

page
|-- modA
`-- modB

现在,我需要在page下启动server。modA和modB是两个spm组件,page是两个组件一起运行的。

那么我预览page的时候,需要同时载入modA和modB的js,假设A的入口文件是index.js,B的入口文件也是index.js。应该怎么开发呢?

现在我的做法是,对A通过/assets/modA/index.js路径加载,包名是modA/index,这样,我可以在页面上同时seajs.use两个组件了。

@popomore
Copy link
Member

  • 线上的访问路径是什么
  • modA 下有 package.json 么?

@shepherdwind
Copy link
Author

  1. 线上访问是作为正常的组件访问的,现在这么用,只是本地开发预览用到,和线上状态无关
  2. modA下有package.json,page下没package.json,一个page通过几个模块组合到一起

@popomore
Copy link
Member

应该是有关系的,serve-spm 的原则就是线下也能保持一样的 url 访问(只是换了 host),serve-spm 增加映射规则来匹配访问 url 和下线文件。

所以详细说明下线上的请求规则吧

@shepherdwind
Copy link
Author

线上是modA/version/index.js这样的路径。

我现在的问题是,serve-spm只能server一个本地spm组件,如果支持多个组件的问题,现在能有解决方案吗?或者,你们只支持这种模式?

@shepherdwind
Copy link
Author

在线上,同一个页面,我会use两个模块,比如

seajs.use('modA/version/index');
seajs.use('modB/version/index');

如何在本地开发modA和modB这两个模块?page是自动生成,肯定不能让page来写require之类的,因为page上有多少个mod是不确定的。

@popomore
Copy link
Member

我感觉加一条 rule 就可以解决,现在的规则是所有的模块都在 spm_modules

^/{name}/{version}/a.js -> /spm_modules/{name}/{version}/a.js

而你需要指定目录,如

^/{name}/{version}/a.js -> /path/to/page/{name}/a.js

@popomore
Copy link
Member

@shepherdwind
Copy link
Author

@popomore 如果可以用rules,我才懒得改代码了。我有尝试过,但是完全没有找到如何通过rules改写define包名的方法。

或者,你可以试试能否通过rules来通过我写的那个用例就行。

    it('define packagen name should be start with prefix', function(done) {
      request(app.listen())
      .get('/index.js')
      .expect(util.define('simple/index', 'exports.a = 1;\n'))
      .expect(200, done);
    });

关健是define下不能是index,需要是simple/index,加上版本也无所谓,但是不能只是index

@popomore
Copy link
Member

define 的 id 应该是根据 url 请求路径返回的,我跑跑你的例子

@coveralls
Copy link

Coverage Status

Coverage increased (+0.02%) when pulling b9df21b on shepherdwind:master into 332c861 on spmjs:master.

})));
});

it('should support serve two spm module at the same app', function(done) {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@popomore 这个是我最终使用的方式。关健是一个app下,serve多个spm组件。

@coveralls
Copy link

Coverage Status

Coverage increased (+0.02%) when pulling df17a9a on shepherdwind:master into 332c861 on spmjs:master.

@sorrycc
Copy link
Member

sorrycc commented Jan 19, 2015

现有的方案应该已经能支持多组件同时调试的。

比如这个目录结构:

page
|-- modA/index.js
`-- modB/index.js

不要用 mount,直接 serveSPM('page/modA')serveSPM('page/modB');,这样即可通过 modA/version/index.jsmodB/version/index.js 访问到不同模块的文件,和 cdn 路径是一致的。

spm-server 就是这样实现的,支持多模块同时调试,比如 spm-server ./modA ./modB

@sorrycc
Copy link
Member

sorrycc commented Jan 19, 2015

另外,如果模块可能随时更新,也可以动态调 serve-spm 来处理。

https://github.com/spmjs/spmjs.io/blob/master/routes/docs.js#L8
参考 spmjs.io 的方法

@shepherdwind
Copy link
Author

ok,原来还能这么访问。我还以为只有spm_modules下可以这么用呢。赞

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

Successfully merging this pull request may close these issues.

4 participants