最近公司项目硬性要求使用vue全家桶+element-ui的方式来开发后台,但是原来的项目是requirejs写的,所以所有laravel模块都是可以独立安装和卸载的,也就是说他们的js和css都是独立的,那些公用的直接放在themes/backend
主题目录下,那么问题来了,单页程序如何实现这种方案,需求
(注意:这里的module是laravel的module,不是js和npm的module)
每个模块独立安装,安装后自动publish模块中的Resources/Bakcend/assets
目录到public/backend/modules/模块名
下面,并且在themes/bakcend/index.blade.php
中可以自动加载(已解决)
单页的后台使用webpack打包,打包目录public/backend/modules/模块名
下面,并在打包后自动复制一份到modules/模块名/Resources/Bakcend/asset
s下面(已解决)
每个模块可以有自己的后台菜单,管理界面等,并且这些全部用vue,vue-router,element-ui实现,所有模块的入口页面位于themes/backend_default/index.blade.php
,(已解决)
4.每个模块可以由不同的第三方自行开发,发布到总的模块中心,使用者可以自行下载所需模块(PHP后端方面已解决,前端JS方面就出现问题了)
问题就出现在以上需求的第四条的前端方面,如果个人或者一个内部团队开发所有模块就没有这个问题,但不同的第三方开发就引起了webpack打包的问题
目前有两种方案,但是都不能从根本上解决问题
第一种是每个laravel-module单独打包,但是公共类库无法处理,因为单页的后台不可能每个module的都生成一个vendor.js放置公共或者把公共类库放入app.js,这样在总的themes/backend_default/index.blade.php
里面加载每个module(blog-module,core-module,dashboard-module等)的vendor.js和app.js就会重复加载这些公共类库
第二种是一个themes/backend主题下集成打包
每个module的资源都放在themes/backend/modules/{module-name}
里面,打包后自动抽取到各自的module/Resources/Backend/assets
中,然后别人安装module的时候自动publish
这个module里面的assets
到public/backend/modules/{module-name
}目录里,但是这样也不行,因为如果每个开发者负责的module不同,所以在webpack.config.js
or webpack.mix.js里打包的东西也是不同的,比如我写blog module
的app.js,你写 dashboard module
的app.js,那么各自打包后的assets生成的vendor.js
(公共类库存放的文件)的webpack module id不同(即使所有的module的app.js的公共类库都一样),publish后加载不同的module的app.js就会出错,因为每个module的vendor.js不一样,不能选择任何一个加载
请问具体如何解决这个问题呢?
参考:/a/11...
基于 webpack 的 SPA 单页 Web 应用 动态加载插件的机制