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

请问自己开发后端解决方案时资源合并这块要怎么处理 #9

Open
fancyboynet opened this issue May 26, 2016 · 13 comments

Comments

@fancyboynet
Copy link

之前一直用的纯前端的解决方案,再手动转化为后端动态模版,效率和维护都不是很高,现在想尝试实现适合自己项目(python-flask)的后端解决方案

查看资料,了解到大致思路时根据_map.json_做静态资源分析,扩展规范推荐的模版标签,最后统一输出

目前我已经扩展好了模版标签,但在实现合并压缩时遇到了困惑,不知道如何实现,是根据map.json里的pkg对象吗,可是我记得pkg对象是fis3-postpackager-loader产生的吧,自己实现的后端解决方案好像是说不用它了吧,那每个页面中的资源合并关系要怎么处理呢

@2betop
Copy link
Contributor

2betop commented May 26, 2016

如果要跟后端打通,是不能用 loader 插件的,因为 loader 是在前端,静态分析的。

目前除了 loader 可以打包外,还有两个插件可以打包。

https://github.com/fex-team/fis3-packager-map
https://github.com/fex-team/fis3-packager-deps-pack

他们只会把打包信息写入到 map.json 里面,后台在分析到资源如果存在 pkg 信息时要,需要使用 pkg 的包,而不是资源自己。

目前有 php 版本和 java 版本,不知道你更习惯看哪个。

php-laravel: https://github.com/fex-team/laravel-fis/blob/master/src/Fis/Resource.php
php-smarty: https://github.com/fex-team/fis-plus-smarty-plugin/blob/master/FISResource.class.php
node yog: https://github.com/fex-team/yog-view/blob/master/lib/layer.js
java jello: https://github.com/fex-team/fis-velocity-tools/blob/master/src/main/java/com/baidu/fis/util/Resource.java

@fancyboynet
Copy link
Author

谢谢回答,还是不太明白,现在模版文件变成了具体的后端语法了,需要运行才知道当前页面的依赖关系,fis3-packager-map 又如何能知道当前模版页面依赖了哪些资源呢

@fancyboynet
Copy link
Author

是不是还要写一个类似fis3-plugin-extlang的插件来解析自己的模版语法?

@fancyboynet
Copy link
Author

@2betop fis3-packager-map 是事先就写好打包信息了吧,这样是不是每个页面是都要写对应的依赖了,感觉不是很灵活

@2betop
Copy link
Contributor

2betop commented May 30, 2016

https://github.com/fex-team/fis3-preprocessor-extlang

可以参考这个,依赖基本上自动分析出来的,不用特意去写。比如 {script}{/script} 里面写了 require('xxx.js') 那个插件会把 xxx.js 这个依赖信息记录在当前模板文件里面。

@fancyboynet
Copy link
Author

fancyboynet commented May 30, 2016

@2betop 我的理解不知道对不对,如果我想直接用后端模板替代纯html,需要做的是:

    {% if False %}
        {% fis_load '/static/style.css' %}
    {% endif %}
  1. 扩展模板标签,由后端控制资源搜集,支持运行时动态加载,例子如上
  2. 编写类似fis3-preprocessor-extlang的插件,让fis在编译时支持特定模板语法,让fis去分析模板资源依赖关系, 最后输出_map.json_

疑惑:

  1. 如果我的理解没错的话,因为map.json是在编译的时候生成的,那当前模板文件所依赖的资源就不是“干净”的了吧,比如上面的_/static/style.css_是不是就会被写入map.json的依赖中呢?

@2betop
Copy link
Contributor

2betop commented May 30, 2016

加入你当前模板叫 A.tpl , 这种引用并不算依赖, style.css 会在 map.json 里面,但是不会在 A.tpl 的依赖中。

后端在分析到 style.css 的时候只会去 map.json 中查找其查出后的 url, 当然如果 style.css 被打包了,会改成用打包后的资源的 url.

@fancyboynet
Copy link
Author

哦对,那现在剩下的问题就是这个类似fis3-preprocessor-extlang是怎么确定A.tpl所依赖的所有资源,并打包输出pkg对象供后端读取了,应该是这样吧

@fancyboynet
Copy link
Author

依赖理解了,合并打包还有点问题
按laravel的解决方案的资源依赖是用fis3-preprocessor-extlang解析的,打包是用fis3-packager-map手动打包的

// pack 相关

  // libs 目录下面的 js 打成一个
  .match('/static/libs/**.js', {
    packTo: 'pkg/lib.js'
  })

  // components 目录下面的打成一个。
  .match('/components/**.js', {
    packTo: '/pkg/components.js'
  })

所有的components都合并到了一个文件,后端运行时再去读取pkg下的资源
这样多个页面不是有可能会加载为引入的多余的组件吗?
如果要实现类似fis3-postpackager-loader的按页面打包,这个实现逻辑是不是要放到后端去实现,而不是读取map.json里的pkg

@2betop
Copy link
Contributor

2betop commented Jun 28, 2016

是的,会存在引入无用 js 的情况,但是个人觉得这并不是问题,当你切到需要那些 js 的页面的时候,浏览器会直接从缓存中拿了。

一般都会预判下,哪些js公用得多,打成一个,其他独立页面的另外再打包。

@fancyboynet
Copy link
Author

如果有很多复杂组件,或者组件多了个人认为就是问题了,顺便问下其它后端解决方案也是手动配置打包资源的?

@2betop
Copy link
Contributor

2betop commented Jun 28, 2016

有个根据日志分析自动生成打包配置的插件,但是并不开源。

关于打包手动配置这块,建议你看下 http://fis.baidu.com/fis3/docs/pack.html

@fancyboynet
Copy link
Author

嗯,个人认为还是自动打包会更利于维护,既然fis已经在编译阶段把依赖关系分析好了,其实后端要做的只是把这些文件按顺序做合并和hash吧

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

No branches or pull requests

2 participants