小公司更注重开发者客户的体验,heroku 万年不开放其他区域,重心都放在企业客户,我盼望搅局者盼很久了。
我本来也想着下一个,就拿现有项目试试,试着试着就迁移了。😂
附两则趣闻:
1) Phoenix 框架的创建者 Chris McCord 现在在 Fly.io 工作,博客说如果 2013 年 37signals 招了他做员工可能就不会开发 Phoenix 了 https://fly.io/blog/how-we-got-to-liveview/ 。目前 Fly.io 的文档和社区有不少内容是关于 Phoenix 的。
2) Fly.io 的 API 是基于 Rails 开发的 😏
Rails 官方添加了一个教程,如何从 webpacker 切换到 webpack:
https://github.com/rails/jsbundling-rails/blob/main/docs/switch_from_webpacker.md
这个方案是引用 npm 包,安装 npm 包用 yarn 或者 npm 都可以。
例如 yarn add @hotwired/turbo-rails
,然后就可以在 app/javascript/application.js
里面:
import "@hotwired/turbo-rails"
esbuild 已经默认把 node_modules 加到 resolving paths 里。
会有重名问题。约定是放到各自的 module 中。
sprockets 和 propshaft 都是实现 assets pipeline 的组件,二选一。propshaft 更精简,解决了一些 sprockets 内部太复杂产生的问题,sprockets 还会继续维护,说不准哪个更长久。如果没遇到 sprockets 引起的问题可以继续用 sprockets,这还是默认。
dartsass-rails 属于 cssbundling 方案,在 assets pipeline 之前编译 css,之后还是交给 assets pipeline 计算 digest 然后在模版里引用。darsass-rails 和 sprockets/propshaft 不是替代关系。
你这又有 importmap 又有 webpacker 的,需要更新参考书,webpacker 已经退役了。
javascript 执行的时候 body 还没解析。
简单的解决方法,可以把 js defer 设 ture,把 js 延后到文档解析完成后执行。
<%= javascript_pack_tag "application", defer: true %>
我看了 bundling 内部实现之后第一想法是这么简单,早这么干就好了。
https://github.com/hotwired/turbo/pull/386
似乎是不支持 data-disable-with
了,新的方法是建议用 css 显隐相关信息,这样更适用于一些复杂的结构——例如显示动画图标。
button .show-when-disabled { display: none; }
button[disabled] .show-when-disabled { display: initial; }
button .show-when-enabled { display: initial; }
button[disabled] .show-when-enabled { display: none; }
<button>
<span class="show-when-enabled">Submit</span>
<span class="show-when-disabled">Submitting...</span>
</button>
rails-ujs 应该要移除了,新创建一个项目没看到 ujs。
es module 是有作用域的,哪个地方 import 只会在当前作用域有效。你可以:
1) 在 application 里 import 之后挂到全局变量 window
import OrgChart from "./src/orgchart"
window.OrgChart = OrgChart
2) 在页面内 import
<script type="module">
import OrgChart from "./src/orgchart"
orgchart = new OrgChart({
///
})
</script>
这个点还没睡的人,一定还没睡吧。
上次讨论这个话题……那还是在上次
已更新分 part 录像,地址见顶楼。
webpacker 6 的改变是正确的方向,对 webpack 有深度集成需求的可以继续用 webpakcer。(例如需要 HMR)
我对 webpack 的插件没有需求,只想 bundle es6 module,那么 esbuild 用起来更简单。
像阿里云个人版是免费
在 github actions 里面构建镜像,然后推到云服务的 docker registry。
发现楼主第二点已经说了
docker-compose.yml 里面修改 db service,加上:
networks:
- kong-net
不然 web 无法访问 db servcie。
其实如果三个 servie 都不加 networks 配置就是可以互相访问的,加了就隔离了。
去掉 self.table_name = 'posts'
看看,我觉得这行已经覆盖了 prefix。
form_with 加个 method: :get
你需要将 text_field 放在 form 里,搜索按钮提交这个 form。
<%= form_with url: tikus_path do |form| %>
<%= form.text_field : soujiaocai %>
<%= @soujiaocais %>
<%= form.submit '搜索', class: 'btn' %>
<% end %>
database.yml 里面
default: &default
# ...
host: db
去掉 socket: /tmp/mysql.sock
rails 和 db 在不同的容器,连接配置要用 service name 作为主机名。
已更正
新机制下 webpack 可以自己配置,webpacker 一个问题是配置是被隐藏起来的,即使懂得 webpack 也很难修改配置。
主要问题是 CI 环境不应该获得这个密钥,不然很难预料在日志或什么地方泄露。
试试 config.require_master_key = false
看看,有用的话可以弄成环境变量选择性关闭。
放到环境变量里不一定安全,还有一些隐患,例如要注意错误捕获服务会不会在报错的时候把 env 一并提交造成外泄;容器编排工具传输 env 也是明文的,没有专门的 secret 机制安全。
用 env 一部分原因是 heroku 这样的服务只支持 env,另外如果是开源软件把 secrets 放到源码库里很怪异,即使别人看不到内容。
k8s 和 docker swarm 支持用文件方式挂载 secrets,这样选择就多了。
哪种方式好我还没定论,目前用的是 dotenv 通过 .env 文件管理环境变量,这样同时支持 env 和文件两种方式设置 secret.
因为 12factor 我没有使用 credentials.yml,然后还需要 SECRET_KEY_BASE,我就用 env 把 SECRET_KEY_BASE 设为 1
RUN RAILS_ENV=production SECRET_KEY_BASE=1 bin/rails assets:precompile