fex-team / jello

Front End Integrated Solution for J2EE Velocity.
206 stars 49 forks source link

jello release -m 后,requirejs 路径问题 #74

Closed ystarlongzi closed 9 years ago

ystarlongzi commented 9 years ago

假设有以下目录:

-- widget
    -- xx
        -- index.js
        -- index.vm
// widget/xx/index.js 内容
module.exports = function () {}
## widget/xx/index.vm 内容
## 法1:引入 js 文件
#require('index.js')

## 法2: 引入 js 文件
#script()
    require(['index.js'], function (app) {});
#end

jello release -m 后,index.js对应的文件名为index_123456.js,那么index.jsindex.vm发布后的内容如下:

// widget/xx/index_123456.js 内容

// 疑问:
// 这里 define 的名称是不是为 widget/xx/index_123456 要合适些?

define('widget/xx/index', function (require, exports, module) {
    module.exports = function () {}
});
## widget/xx/index.vm 内容
## 法1:js文件路径地址
<script src="widget/xx/index_123456.js"></script>

## 法2:require 的js文件路径地址
<script>
    // 疑问:
    // 这里 requirejs 路径地址是不是也应为 widget/xx/index_123456 ?
    requirejs(['widget/xx/index'], function (app) {});
</script>
2betop commented 9 years ago

你注意看 widget/xx/index_12345.js 里面 define 的 id 还是原来的路径。

require 使用的时候当然还是原来的路径。

你这种实际上是同步用法,如果是异步用法,实际上,框架会自动生成 require.conf({paths: {xxx}}) 映射表的。

ystarlongzi commented 9 years ago

@2betop

define 里面的 id,如果还是原来路径的话,那么通过 requirejs 是无法加载对应的脚本文件的。。

=== update 2015-09-14 19:39 ===

例子中widget/xx/index.vm内容里的

## 这里使用标记是用来和 reqiurejs 做对比的
#require('index.js')

#script()
    require(['index.js'], function (app) {});
#end
2betop commented 9 years ago

define 里面的 id,如果还是原来路径的话,那么通过 requirejs 是无法加载对应的脚本文件的。。

但是程序会自动生成转换表,除非哪里出错了,一直以来都是这么干的。

// jello 会自动生成这块。
require.config({
  paths: {
     'widget/xx/index': '/static/widget/xx/index_12345'
  }
})
ystarlongzi commented 9 years ago

@2betop

  1. require.config配置是生成到 map.json 里的?
  2. 我这里 jello 的环境版本是 1.0.7,如果是下面这样的代码,那么是无法加载到对应脚本的
## widget/xx/index.vm 内容

#script()
    // 会加载 widget/xx/index.js 文件
    // 而不是 widget/xx/index_123456.js 文件
    requirejs(['index.js'], function (app) {});
#end
2betop commented 9 years ago

怎么是 requirejs ? 而不是 require(['index.js']) ?

另外你注意下你的 widget 最后有没有 require 自己

#require('./index.vm')
ystarlongzi commented 9 years ago

@2betop 谢谢!!已解决

  1. 是因为 widget 没有 require 自己
  2. require(['index.js']),而不是requirejs(['index.js']),描述时写requirejs主要为了和#require标记区别(目前看这样描述是不准确)
ystarlongzi commented 9 years ago

@2betop 这个 require.config 是生成到个文件里的?

// jello 会自动生成这块。
require.config({
  paths: {
     'widget/xx/index': '/static/widget/xx/index_12345'
  }
})
2betop commented 9 years ago

这个是框架自动在页面里面里面输出的,不是文件里面。

你可能还没看到这个表,是因为 amd 把全局的异步 require 当同步对待了。具体看配置项里面的第3点:https://github.com/fex-team/fis-postprocessor-amd

你把他设置成 false 就看到了。

ystarlongzi commented 9 years ago

@2betop

谢谢!!! 请收下膝盖