برنامه نویسی

اشکال زدایی پیشرفته برای محرک – جامعه dev

این مقاله در ابتدا در Rails Designer منتشر شد


محرک یک حالت اشکال زدایی اساسی دارد که نشان می دهد آیا محرک در حال اجرا است و لیست می کند که کنترل کننده اولیه و متصل شده است. اما وقتی اغلب با کنترل کننده های محرک کار می کنید ، نیاز به دیدن جزئیات کمی بیشتر وجود دارد ، بدون اینکه انتظار داشته باشید DOM در مقابل منطق کنترل کننده شما باشد.

بنابراین من یک ایده جدید را کاوش کردم و آن را به عنوان جدید اضافه کردم FX به محرک fx: ارباببشر این همان چیزی است که به شما می دهد:

شرح تصویر

تنظیم آن آسان است:

// app/javascript/controllers/application.js

+import { enableDebug } from "stimulus-fx"

-const application = Application.start()

+const application = enableDebug(Application.start())
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

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

export default class extends Controller {
+  static debug = true
+
// …
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من این را بیشتر به عنوان یک ویژگی آزمایشی اضافه کردم تا ببینم آیا ممکن است و با انتشار آن ، امیدوارم که از کسی از شما الهام بگیرد ، این مسئله را حتی بیشتر گسترش دهد. من خودم ایده هایی دارم ، اما نمی خواهم بر شما تأثیر بگذارم.

چگونه کار می کند

کد این کار به طرز شگفت آور ساده است. این یک ایجاد می کند enableDebug تابعی که طول می کشد application به عنوان یک استدلال (همانطور که از استفاده مشاهده می شود: enableDebug(Application.start())).

import { debuggable } from "./debuggable";
import { initialize } from "./enableDebug/initialize";
import { values } from "./enableDebug/values";
import { targets } from "./enableDebug/targets";

export function enableDebug(application) {
  const debugFeatures = [
    initialize,
    targets,
    values
  ];

  return debuggable(application, { with: debugFeatures });
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

ببینید چقدر قابل خواندن است؟ “برنامه اشکال زدایی قابل برگشت با ویژگی های (اشکال زدایی)”.

سپس در debuggable این ویژگی ها را از ویژگی های داده شده حلقه می کند: features.forEach(feature => feature(identifier, callbacks)); فراخوانی ویژگی با شناسه و تماس های برگشتی (روشهای چرخه عمر). در initialize توابع ساده است:

export function initialize(identifier, callbacks) {
  const debugCallback = ({ for: lifecycle }) => ({
    log(context) {
      console.group(`#${lifecycle}`);

      console.log("details:", {
        application: context.application,
        identifier,
        controller: context,
        element: context.element
      });

      console.groupEnd();
    }
  });

  ["initialize", "connect", "disconnect"].forEach(lifecycle => {
    callbacks[lifecycle].push(function() {
      debugCallback({ for: lifecycle }).log(this);
    });
  });
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

در اینجا ، من می خواهم خوانایی را نیز برجسته کنم: “پاسخ به پاسخ به چرخه چرخه”. خوب ، درست است؟

در ارزش ها وت اهداف منطق کمی بیشتر از آن است ، بیایید نگاه کنیم SRC/EnableDebug/storate.js:

export function values(identifier, callbacks) {
  callbacks.connect.push(function() {
    logValues({ on: this.element, for: identifier });
  });
}

function logValues({ on: element, for: identifier }) {
  const values = allValues(element, identifier);

  if (Object.keys(values).length === 0) return;

  console.group("Values");
  console.table(values);
  console.groupEnd();
}

function allValues(element, identifier) {
  const prefix = `${identifier}-`;
  const dataPrefix = "data-";
  const valueSuffix = "-value";

  // logic to get values from the element/identifier
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نتیجه را از logValues، که فقط گروه بندی شده است console.table نتیجه روی وصل کردن آرایه ای که در src/debuggable.js (برای اهداف نیز همین اتفاق می افتد):

export function debuggable(application, { with: features }) {
  // …
  const callbacks = {
    initialize: [],
    connect: [],
    disconnect: []
  };
  // …
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

هنوز در src/debuggable.js این توابع سپس در کنترلر فراخوانی می شوند وصل کردن (و سایر روشهای چرخه عمر):

export function debuggable(application, { with: features }) {
  // …

  controller.prototype.connect = function() {
    callbacks.connect.forEach(hook => hook.call(this));

    // …
  };
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

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

اگر سوالی دارید به من اطلاع دهید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا