spmjs / spm

Brand new static package manager.
http://spmjs.io
Other
903 stars 180 forks source link

spm build构建,不会去读 seajs.config 配置吗? #1391

Closed tianqingyu closed 8 years ago

tianqingyu commented 8 years ago

环境:spm 3.6.11 框架:seajs 3.0.0

现在用 spm build命令去打包项目文件,提示 require 找不到模块(已经去掉define包裹了),原因是我在require模块时,全部使用了 seajs.config.alias, seajs.config.paths。

那么问题来了,spm打包,难道不会读取 seajs.config 配置文件吗?看了很多文档了,推荐使用spm-sea,但是这个工具,也没用看到配置seajs.config的地方啊。

是隐藏的太深了,没有文档,还是根本不支持啊。

在线等,这个问题,让我郁闷2天了,还没有找到解决办法。

还有一个问题: spm server 运行的时候,怎么指定多个入口js文件。我的项目有多个页面,且在不同的目录下面,每个页面都有自己的done.js入口文件的。 spm server 运行的时候,只指定某个入口文件(spm.main),会自动包裹一些webpack的代码,其他没有指定的入口文件,就不会包裹,那么我本地调试的话,页面运行就包js错误(define为undefined),这个要怎么解决?

jaredleechn commented 8 years ago

spm 3.6 之后是完全独立开seajs的构建工具了,打包方式采取不同于之前的standalone方式,通俗来说就是你所有依赖的模块都会被打包进去,而不是seajs根据config在线加载了。

var module = require('./yourmodule.js'); // require本地模块
var dialog = require('arale-dialog'); // require spm_modules里的模块

首先在你的package.json里指定out属性来输出你的多个页面和多个js,然后spm会自动动态构建你的out指定的那些文件,每个页面只要加载原始目录下而非打包输出的目录下自己所需的js文件即可。

页面运行就包js错误(define为undefined)

spm 3.6之后自己的代码中不要在继续用define写模块了,可以参考spmjs.io上的模块编写方式。

tianqingyu commented 8 years ago

@jaredleechn 感谢回复。

问题1: 是这样的,我的项目已经开发完成,就差打包部署到线上了,全程使用seajs来做的,因此代码都是cmd规范,require的id解析是严重依赖seajs.config配置。 如果要修改成commonJS的规范,那改动就大了去了。切换到spm3.6之后的代码规范,也一样麻烦。 所以,我的问题就是,不改变我现有的模块规范,有什么工具能够合并打包CMD的代码,require依赖模块的时候,能不能根据 seajs.config 配置来,避免解析错误。 再者,我说的多页面的情况是,我只有js,css等资源,页面都在后端代码上,是分离的,我是输出不了html之类的页面。说白了,我的只是项目中的前端资源部分,需要打包部署下而已

问题2: spm server运行时,有多个done.js入口文件时,报的错误是 require为undefined(上面是我说错了)。我之前试着删除所有js文件的 define包裹,按照 commonJS 的规范来做了一次,不过在spm server运行时,碰到问题了; 举个例子 spm server src/a/a.js ,pageA页面 script=src/a/a.js,没有任何问题,但是pageB页面 script=src/b/b.js 就报js错误了。 spm server 应该如何指定多个entry文件(我看webpack-dev-server的配置文件,entry可以是数组,spm.main只能是字符串)

tianqingyu commented 8 years ago

image 这是我的资源目录结构

tianqingyu commented 8 years ago

image 部分seajs.config配置

jaredleechn commented 8 years ago
  1. 首先还是推荐升级到3.6,因为他带来功能的提升是远远大于代码的修改的,从你的代码上看,只需要把define去掉,require本地模块时直接写相对路径即可(参考文档),如果一定要保持的话,只能使用spm-sea来进行打包了
  2. main是代表组件的entry。我想你需要的是output属性,代表输出的chunk,在package.json中配置output属性为你的多个需要打包的文件即可(参考例子)。BTW,spm-sea的配套调试工具是spm-server,和spm-sea一样需要独立安装
tianqingyu commented 8 years ago

@jaredleechn 感谢回复啊。spm-sea能读seajs.config配置吗?没找到这个功能