سلام
من پروژه فونیکس رو با دستورات زیر برای حالت prod کامپایل کردم (در حالت dev من مشکلی ندارم )
نسخه فونیکس 1.3.3
نسخه الکسیر 1.6.4
کانتینر رو ساختم
-> sudo docker run -d --rm --name elixir \
-v "/html_app/:/html_app" \
mojtabanaserei/elixir:1.6.4 \
sh -c " \
apk add python make g++ && \
npm install -g brunch yarn && \
sleep 50000
"
وارد کانتینر شدم
-> sudo docker exec -it elixir ash
وارد مسیر پروژه شدم
-> cd html_app/html_site_umbrella
دایرکتوری ها و فایلهایی که در حالت dev ساخته شده بودن رو پاک کردم
-> rm -r _build deps apps/html_site_web/assets/node_modules
وابستگی های مورد نیاز برای حالت prod رو گرفتم
-> mix deps.get --only prod
کلید خصوصی برای حالت prod رو درست کردم
-> MIX_ENV=prod mix phx.gen.secret
کلید تولید شده رو در فایل زیر قرار دادم به جای کد قبلی
-> vi apps/html_site_web/config/prod.secret.exs
کامپایل کردم
-> MIX_ENV=prod mix compile
وارد مسیر asset شدم
-> cd apps/html_site_web/assets
ساختن فایل های asset برای حالت prod
-> brunch build --production && cd ..
-> MIX_ENV=prod mix phx.digest
مجددا به مسیر پروژه برگشتم
-> cd /html_app/html_site_umbrella
سرور رو تست کردم و اجرا شد
-> PORT=4000 MIX_ENV=prod mix phx.server
بعد از کانتینر خارج شدم و کانتینر رو حذف کردم
چون از nginx بعنوان پروکسی استفاده میکنم فایلهای موجود در مسیر زیر رو داخل کانتینر nginx والیوم کردم
apps/html_site_web/priv/static
بعد از ران کردن سرویس ها . سایت بالا میاد ولی یه مشکلی وجود داره .
خطای زیر رو در مرورگر موزیلا دارم
SyntaxError: import declarations may only appear at top level of a module
خطای زیر رو هم در مرورگر کروم دارم
Uncaught SyntaxError: Unexpected string
با سرچی که زدم اینو پیدا کردم
و طبق راه حل توی کد تغییر ایجاد کردم به این صورت
تغییر خط زیر از
<script src="<%= static_path(@conn, "/js/app.js") %>"></script>
به
<script src="<%= static_path(@conn, "/js/app.js") %>" type="module"></script>
خروجی در مرورگر که inspect کردم هم به این صورت هست
<script src="/js/app-c0a3ede01d7f0bd9471ced4a79e56ecd.js?vsn=d" type="module"></script>
ولی مشکل همچنان رفع نشده
البته در بعضی صفحات من کدهای js دیگه ای هم دارم که مربوط به کچپا گوگل هست تا در زمان تایید کاربر یا timeout یه کاری رو انجام بدن . کدهاش به این صورت هست
<script>
function recaptcha_callback_login_html() {$("#button_login_html").removeAttr("disabled","disabled");}
function recaptcha_expired_login_html() {$("#button_login_html").attr("disabled","disabled");}
</script>
اینم زمانی که میخواد اجرا بشه در مرورگر کروم یه خطای تولید میکنه
Uncaught (in promise) null
یا در مرورگر موزیلا
uncaught exception: null