egg-view-assets 提供了通用的靜態(tài)資源管理和本地開發(fā)方案,有如下功能
可以先查看示例
可通過自動或手動的方式添加靜態(tài)資源,以下有兩種方式
assets 模板引擎并非服務端渲染,而是以一個靜態(tài)資源文件作為入口,使用基礎模板渲染出 html,并將這個文件插入到 html 的一種方式,查看使用 roadhog 的例子。
配置插件
// config/plugin.js |
配置 assets 模板引擎
// config/config.default.js |
添加靜態(tài)資源入口文件 app/view/index.js,然后調(diào)用 render 方法進行渲染
// app/controller/home.js |
渲染的結(jié)果如下
<!doctype html> |
注意:這個路徑生成規(guī)則是有映射的,如 index.js -> http://127.0.0.1:8000/index.js。如果本地開發(fā)工具不支持這層映射,比如自定義了 entry 配置,可以使用其他模板引擎。
一般默認的 html 無法滿足需求,可以指定模板路徑和模板引擎。
// config/config.default.js |
添加模板文件
<!doctype html> |
egg-view-assets 插件提供了 helper.assets 根據(jù)自己的場景調(diào)用,helper.assets.getScript() 可以不用傳參,會將 render 函數(shù)的參數(shù)透傳。
支持根據(jù)不同頁面指定模板,可以在 render 方法傳參
// app/controller/home.js |
以上例子是將靜態(tài)資源放到 app/view 目錄下,但大部分情況希望放到獨立目錄,如 app/assets。因為 assets 模板引擎使用 egg-view 的加載器,所以直接修改其配置
// config/config.default.js |
如果無法滿足文件映射,可以配合其他模板引擎使用,這時不需要配置 assets 模板引擎,查看使用 umi 的例子。
// config/config.default.js |
渲染模板
// app/controller/home.js |
添加模板文件(簡化了 umi 的模板)
<!doctype html> |
在其他模板中必須添加參數(shù)生成需要的靜態(tài)資源路徑
有時候前端需要獲取服務端數(shù)據(jù),所以在渲染頁面時會向 window 全局對象設置數(shù)據(jù)。
assets 模板引擎可直接傳入?yún)?shù),默認前端代碼可以從 window.context 獲取數(shù)據(jù)。
// app/controller/home.js |
其他模板引擎需要調(diào)用 helper.assets.getContext(__context__) 并傳入上下文的參數(shù)
// app/controller/home.js |
默認屬性為 context,這個可以通過配置修改
exports.assets = { |
這種模式最重要的是和構(gòu)建工具整合,保證本地開發(fā)體驗及自動部署,所以構(gòu)建工具和框架需要有一層約定。
下面以 roadhog 為例
構(gòu)建工具的 entry 配置決定了映射關系,如基于 webpack 封裝的 roadhog、umi 等工具內(nèi)置了映射關系,如果單獨使用 webpack 需要根據(jù)這層映射來選擇用哪種方式。
roadhog 完全滿足這個映射關系使用 assets 模板引擎。而 umi 不滿足文件映射,因為他只有一個入口 umi.js 文件,所以選擇其他模板引擎的方案。
其他構(gòu)建工具的接入需要滿足這層映射關系。
查看示例配置,本地服務配置成 roadhog dev,配置 port 來檢查服務是否啟動完成,因為 roadhog 默認啟動端口為 8000,所以這里配置成 8000。
exports.assets = { |
靜態(tài)資源部署之前需要構(gòu)建,配置 roadhog build 命令,并執(zhí)行 npm run build
{ |
注意:這里添加了 SET_PUBLIC_PATH 變量是因為 roadhog 這樣才能開啟 publicPath
構(gòu)建的結(jié)果根據(jù) .webpackrc 配置的 output 決定,示例是放到 app/public 目錄下,由 egg-static 提供服務。
同時根據(jù) .webpackrc 配置的 manifest 生成一個 manifest.json 文件到 config 目錄下(egg 需要讀取這個文件作為映射關系)。
現(xiàn)在應用啟動后可以通過 http://127.0.0.1:7001/public/index.{hash}.js 訪問靜態(tài)資源,發(fā)現(xiàn)這里多了一層 public 的路徑,所以需要添加 publicPath 配置。
// config/config.prod.js |
一般靜態(tài)資源都會發(fā)到 CDN,所以在構(gòu)建完成后需要平臺將構(gòu)建產(chǎn)物發(fā)布到 CDN 上,如 https://cdn/myapp/index.{hash}.js。
現(xiàn)在除了 publichPath 還需要修改靜態(tài)資源地址
// config/config.prod.js |
更多建議: