توسعه Odoo

Welcome!

This community is for professionals and enthusiasts of our products and services.
Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.

9

اودوو ۱۶ نسخه ویراوب ۱۲۳ از چه نوع فایل های جاوا اسکریپتی پشتیبانی میکند؟

من در مورد فایل های جاوا اسکریپتی که اودوو ۱۶ پشتیبانی میکند اطلاعاتی در دسترس ندارم میشه در مورد اون به من توضیحاتی بدین؟؟

آواتار
انصراف
1 پاسخ
7
آواتار
فردین مردانی
بهترین پاسخ

اودوو ۱۶ نسخه ویراوب ۱۲۳ از سه نوع مختلف فایل جاوا اسکریپت پشتیبانی می کند:

  • فایل های جاوا اسکریپت ساده (بدون سیستم ماژول)،

  • ماژول بومی جاوا اسکریپت

  • ماژول های Odoo (با استفاده از یک سیستم ماژول سفارشی)،

همانطور که در صفحه مدیریت دارایی ها توضیح داده شد ، همه فایل های جاوا اسکریپت با هم ترکیب شده و به مرورگر ارائه می شوند. توجه داشته باشید که فایل‌های جاوا اسکریپت بومی توسط سرور Odoo پردازش شده و به ماژول‌های سفارشی Odoo تبدیل می‌شوند.

اجازه دهید به طور خلاصه هدف هر نوع فایل جاوا اسکریپت را توضیح دهیم. فایل‌های جاوا اسکریپت ساده باید فقط برای کتابخانه‌های خارجی و برخی اهداف کوچک خاص در سطح پایین رزرو شوند. تمام فایل های جاوا اسکریپت جدید باید در سیستم ماژول جاوا اسکریپت بومی ایجاد شوند. سیستم ماژول سفارشی فقط برای فایل‌های قدیمی و هنوز تبدیل نشده مفید است.

فایل های جاوا اسکریپت ساده

فایل های جاوا اسکریپت ساده می توانند حاوی محتوای دلخواه باشند. توصیه می شود هنگام نوشتن چنین فایلی از سبک اجرای تابع بلافاصله فراخوانی iife استفاده کنید:

(function () {

  // some code here

  let a = 1;

  console.log(a);

})();

مزایای چنین فایل هایی این است که از نشت متغیرهای محلی به دامنه جهانی جلوگیری می کنیم.

واضح است که فایل‌های جاوا اسکریپت ساده مزایای یک سیستم ماژول را ارائه نمی‌دهند، بنابراین باید مراقب ترتیب موجود در بسته بود (زیرا مرورگر آنها را دقیقاً به ترتیب اجرا می‌کند).

توجه داشته باشید

در Odoo، تمام کتابخانه های خارجی به صورت فایل های جاوا اسکریپت ساده بارگذاری می شوند.

ماژول های جاوا اسکریپت بومی

اکثر کدهای جدید جاوا اسکریپت Odoo باید از سیستم ماژول جاوا اسکریپت بومی استفاده کنند. این ساده‌تر است و مزایای تجربه توسعه‌دهنده بهتر را با ادغام بهتر با IDE به ارمغان می‌آورد.

نکته بسیار مهمی وجود دارد که باید بدانید: Odoo باید بداند کدام فایل ها باید به ماژول های Odoo ترجمه شوند و کدام فایل ها نباید ترجمه شوند. این یک سیستم انتخابی است: Odoo به خط اول یک فایل JS نگاه می کند و بررسی می کند که آیا رشته @odoo-module در آن وجود دارد یا خیر . اگر چنین است، به طور خودکار به یک ماژول Odoo تبدیل می شود.

به عنوان مثال، اجازه دهید ماژول زیر را در نظر بگیریم که در web/static/src/file_a.js:

/** @odoo-module **/

import { someFunction } from './file_b';

export function otherFunction(val) {

    return someFunction(val + 3);

}

به نظر خط اول توجه کنید: توضیح می دهد که این فایل باید تبدیل شود. هر فایلی بدون این نظر همانطور که هست نگه داشته می شود (که به احتمال زیاد یک خطا خواهد بود). سپس این فایل به یک ماژول Odoo ترجمه می شود که به شکل زیر است:

odoo.define('@web/file_a', function (require) {

'use strict';

let __exports = {};

const { someFunction } = require("@web/file_b");


__exports.otherFunction = function otherFunction(val) {

    return someFunction(val + 3);

};

return __exports;

)};

بنابراین، همانطور که می بینید، تغییر اساساً در حال اضافه کردن odoo.defineو به روز رسانی بیانیه های واردات/صادرات است.

نکته مهم دیگر این است که ماژول ترجمه شده یک نام رسمی دارد: @web/file_a . این نام واقعی ماژول است. هر واردات نسبی نیز تبدیل خواهد شد. به هر فایلی که در افزونه Odoo قرار دارد، some_addon/static/src/path/to/file.jsنامی با پیشوند نام افزونه مانند زیر اختصاص داده می‌شود: @some_addon/path/to/file .

واردات نسبی کار می کند، اما تنها در صورتی که ماژول ها در همان افزونه Odoo باشند. بنابراین، تصور کنید که ساختار فایل زیر را داریم:

addons/

    web/

        static/

            src/

                file_a.js

                file_b.js

    stock/

        static/

            src/

                file_c.js

فایل می تواند به این صورت file_bوارد شود :file_a

/** @odoo-module **/

import {something} from `./file_a`

اما file_cباید از نام کامل استفاده کنید:

/** @odoo-module **/

import {something} from `@web/file_a`

ماژول های مستعار

از آنجایی که ماژول‌های Odoo از الگوی نام‌گذاری ماژول‌های متفاوتی پیروی می‌کنند، سیستمی وجود دارد که اجازه می‌دهد یک انتقال آرام به سمت سیستم جدید انجام شود. در حال حاضر، اگر یک فایل به یک ماژول تبدیل شود (و بنابراین از قرارداد نامگذاری جدید پیروی کند)، سایر فایل‌هایی که هنوز در پروژه به نحوی شبیه ES6 تبدیل نشده‌اند، نمی‌توانند به ماژول نیاز داشته باشند. نام‌های مستعار اینجا هستند تا با ایجاد یک تابع پراکسی کوچک، نام‌های قدیمی را با نام‌های جدید ترسیم کنند. سپس ماژول را می توان با نام جدید و قدیمی خود نامید .

برای افزودن چنین نام مستعاری، تگ نظر در بالای فایل باید به شکل زیر باشد:

/** @odoo-module alias=web.someName**/

import { someFunction } from './file_b';

export default function otherFunction(val) {

    return someFunction(val + 3);

}

سپس، ماژول ترجمه شده نیز یک نام مستعار با نام درخواستی ایجاد می کند:

odoo.define(`web.someName`, function(require) {

    return require('@web/file_a')[Symbol.for("default")];

});

رفتار پیش‌فرض نام‌های مستعار این است که defaultمقدار ماژول مستعار را دوباره صادر کنند. این به این دلیل است که ماژول‌های «کلاسیک» معمولاً یک مقدار واحد را صادر می‌کنند که مستقیماً استفاده می‌شود، تقریباً با معنایی صادرات پیش‌فرض مطابقت دارد. با این حال، می‌توان به طور مستقیم تری تفویض اختیار کرد و رفتار دقیق ماژول مستعار را دنبال کرد:

/** @odoo-module alias=web.someName default=0**/

import { someFunction } from './file_b';

export function otherFunction(val) {

    return someFunction(val + 3);

}

در آن صورت، این یک نام مستعار را دقیقاً با مقادیر صادر شده توسط ماژول اصلی تعریف می کند:

odoo.define(`web.someName`, function(require) {

    return require('@web/file_a');

});

توجه داشته باشید

تنها یک نام مستعار را می توان با استفاده از این روش تعریف کرد. اگر به نام دیگری نیاز دارید تا مثلاً سه نام برای فراخوانی یک ماژول داشته باشید، باید یک پروکسی به صورت دستی اضافه کنید. این عمل خوبی نیست و باید از آن اجتناب شود مگر اینکه گزینه دیگری وجود داشته باشد.

محدودیت ها

به دلایل عملکرد، Odoo از تجزیه کننده کامل جاوا اسکریپت برای تبدیل ماژول های بومی استفاده نمی کند. بنابراین، تعدادی محدودیت وجود دارد، از جمله:

  • یک importیا exportکلمه کلیدی نمی تواند قبل از یک کاراکتر غیر فاصله باشد،

یک نظر یا رشته چند خطی نمی تواند دارای خطی باشد که با importیا شروع می شودexport

// supported

import X from "xxx";

export X;

  export default X;

    import X from "xxx";

/*

 * import X ...

 */

/*

 * export X

 */

// not supported

var a= 1;import X from "xxx";

/*

  import X ...

*/

وقتی یک شی را صادر می کنید، نمی تواند حاوی نظر باشد
// supported

export {

  a as b,

  c,

  d,

}


export {

  a

} from "./file_a"

// not supported

export {

  a as b, // this is a comment

  c,

  d,

}

export {

  a /* this is a comment */

} from "./file_a"

  • Odoo به راهی برای تعیین اینکه آیا یک ماژول با یک مسیر (مانند ./views/form_view) یا یک نام (مانند web.FormView) توصیف می شود، نیاز دارد. برای انجام این کار باید از یک اکتشافی استفاده کند: اگر /در نام وجود داشته باشد، یک مسیر در نظر گرفته می شود. این بدان معناست که Odoo دیگر واقعاً از نام ماژول‌ها پشتیبانی نمی‌کند /.

از آنجایی که ماژول‌های «کلاسیک» منسوخ نشده‌اند و در حال حاضر برنامه‌ای برای حذف آن‌ها وجود ندارد، می‌توانید و باید در صورت مواجهه با مشکلات یا محدودیت‌های ماژول‌های بومی، از آنها استفاده کنید. هر دو سبک می توانند در یک افزونه Odoo وجود داشته باشند.

سیستم ماژول Odoo

Odoo یک سیستم ماژول کوچک (واقع در فایل addons/web/static/src/js/boot.js، که ابتدا باید بارگذاری شود) تعریف کرده است. سیستم ماژول Odoo، با الهام از AMD، با تعریف عملکرد defineبر روی شی جهانی odoo کار می کند. سپس هر ماژول جاوا اسکریپت را با فراخوانی آن تابع تعریف می کنیم. در چارچوب Odoo، یک ماژول یک قطعه کد است که در اسرع وقت اجرا می شود. این یک نام و به طور بالقوه وابستگی هایی دارد. هنگامی که وابستگی های آن بارگذاری می شوند، یک ماژول نیز بارگذاری می شود. سپس مقدار ماژول، مقدار بازگشتی تابعی است که ماژول را تعریف می کند.

به عنوان مثال، ممکن است به شکل زیر باشد:

// in file a.js

odoo.define('module.A', function (require) {

    "use strict";

    var A = ...;

    return A;

});

// in file b.js

odoo.define('module.B', function (require) {

    "use strict";

    var A = require('module.A');

    var B = ...; // something that involves A

    return B;

});

یک راه جایگزین برای تعریف یک ماژول، ارائه لیستی از وابستگی ها در آرگومان دوم است.

odoo.define('module.Something', ['module.A', 'module.B'], function (require) {

    "use strict";

    var A = require('module.A');

    var B = require('module.B');

    // some code

});

اگر برخی از وابستگی ها گم شده باشند/آماده نباشند، ماژول به سادگی بارگذاری نمی شود. پس از چند ثانیه یک هشدار در کنسول وجود دارد.

توجه داشته باشید که وابستگی های دایره ای پشتیبانی نمی شوند. منطقی است، اما به این معنی است که باید مراقب بود.

تعریف ماژول

این odoo.defineروش دارای سه آرگومان است:

  • moduleName: نام ماژول جاوا اسکریپت. این باید یک رشته منحصر به فرد باشد. قرارداد این است که نام افزونه odoo به دنبال یک توضیح خاص باشد. به عنوان مثال، web.Widgetماژول تعریف شده در webافزونه را توصیف می کند که یک Widgetکلاس را صادر می کند (زیرا حرف اول بزرگ است)
    اگر نام منحصر به فرد نباشد، یک استثنا پرتاب می شود و در کنسول نمایش داده می شود.

dependencies: آرگومان دوم اختیاری است. اگر داده شود، باید لیستی از رشته ها باشد که هر کدام مربوط به یک ماژول جاوا اسکریپت است. این وابستگی هایی را که باید قبل از اجرای ماژول بارگذاری شوند، توصیف می کند. اگر وابستگی ها به صراحت در اینجا ذکر نشده باشند، سیستم ماژول آنها را با فراخوانی toString بر روی آن از تابع استخراج می کند و سپس از یک regexp برای یافتن تمام عبارات استفاده می کند require.

odoo.define('module.Something', ['web.ajax'], function (require) {

    "use strict";

    var ajax = require('web.ajax');

    // some code here

    return something;

});

  • در نهایت، آخرین آرگومان تابعی است که ماژول را تعریف می کند. مقدار برگشتی آن مقدار ماژول است که ممکن است به ماژول های دیگری که به آن نیاز دارند ارسال شود. توجه داشته باشید که یک استثنا کوچک برای ماژول های ناهمزمان وجود دارد، به بخش بعدی مراجعه کنید.

اگر خطایی رخ دهد، در کنسول (در حالت اشکال زدایی) ثبت می شود:

  • Missing dependencies: این ماژول ها در صفحه نمایش داده نمی شوند. ممکن است فایل جاوا اسکریپت در صفحه نباشد یا نام ماژول اشتباه باشد

  • Failed modules: یک خطای جاوا اسکریپت شناسایی شده است

  • Rejected modules: ماژول یک Promise رد شده را برمی گرداند. آن (و ماژول های وابسته به آن) بارگیری نمی شود.

  • Rejected linked modules: ماژول هایی که به یک ماژول رد شده وابسته هستند

  • Non loaded modules: ماژول هایی که به یک ماژول گم شده یا شکست خورده وابسته هستند

ماژول های ناهمزمان

ممکن است اتفاق بیفتد که یک ماژول قبل از آماده شدن باید کارهایی را انجام دهد. به عنوان مثال، می تواند یک rpc برای بارگذاری برخی از داده ها انجام دهد. در این صورت، ماژول به سادگی می تواند یک وعده را برگرداند. سیستم ماژول قبل از ثبت ماژول به سادگی منتظر تکمیل وعده می ماند.

odoo.define('module.Something', function (require) {

    "use strict";

    var ajax = require('web.ajax');

    return ajax.rpc(...).then(function (result) {

        // some code here

        return something;

    });

});




آواتار
انصراف