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