ذات مرة ، رأيت رمزًا في مشروع فريق مجاور أنشأ سلسلة بمعلمات عنوان URL للإدراج اللاحق في iframe
سمة src.
قد تبدو هذه المقالة غير ضرورية أو واضحة أو بسيطة للغاية ، ولكن بما أن هذا موجود في الحياة البرية ، فلا يجب أن تكون صامتًا بشأن هذا ، ولكن بدلاً من ذلك ، تشارك أفضل الممارسات.
هذا هو الكود الأصلي:
const createQueryString = (param1, param2, objectId, timestamp, name) => {
const encodedTimestamp = encodeURIComponent(timestamp);
const delimiter = '&';
const queryString = `${param1}${delimiter}
param2=${param2}${delimiter}
objectId=${objectId}${delimiter}
itemTimestamp=${encodedTimestamp}${delimiter}
itemName=${name}`;
return queryString.replace(/ /g, '%20');
};
للإشارة ، param1
وفي param2
القانون الأصلي لها أسماء ناطقة. ويمكن أن تكون قيمهم أي سلاسل تحتوي على الكثير من الأحرف غير الصالحة لأحرف URL
ما هي المشاكل التي يعاني منها هذا الرمز؟
- أولاً ، هذا هو الغياب
encodeURIComponent
لكل قيمة ، والتي قد تحتوي على أي أحرف على الإطلاق. (في سياق هذه المهمة ، يتم تعيين هذه الأسماء من قبل المستخدمين ويمكن أن تحتوي على جميع أنواع الأحرف مثل علامات العطف أو المسافات أو أحرف التشكيل) ؛ - ثانيًا ، هذه مسافات إضافية وفواصل أسطر تظهر بسبب عامل سلسلة القالب
`
؛ يحاول مؤلف هذا الكود إصلاحه باستخدام الطريقة .replace()
، لكن هذا الأسلوب لا يحل أي شيء ؛ - ثالثًا ، من الصعب قراءة التعليمات البرمجية غير القابلة للتوسيع بسبب البنية المحددة ، المعرضة للخطأ.
كيفية إصلاحها؟
النهج الأول:
const delimiter = '&';
const createQueryString = (param1, param2, objectId, timestamp, name) => {
const queryString = [
`param1=${encodeURIComponent(param1)}`,
`param2=${encodeURIComponent(param2)}`,
`objectId=${encodeURIComponent(objectId)}`,
`itemTimestamp=${encodeURIComponent(timestamp)}`,
`itemName=${encodeURIComponent(name)}`
].join(delimeter);
return queryString;
};
? . , encodeURIComponent
. , . .
? ! :
const createQueryString = (param1, param2, objectId, timestamp, name) => {
const queryParams = {
param1,
param2,
objectId,
itemTimestamp: timestamp,
itemName: name
};
const encodeAndJoinPair = pair => pair.map(encodeURIComponent).join('=');
return Object.entries(queryParams).map(encodeAndJoinPair).join('&');
};
. , — .
, . , .
. , ? , queryParams
. . , . , :
const encodeAndJoinPair = pair => pair
.map(encodeURIComponent)
.join('=');
const createQueryString = objectParams => Object
.entries(objectParams)
.map(encodeAndJoinPair)
.join('&');
};
utils.js
.
URLSearchParams
Web API. URLSearchParams .
:
const createQueryString = objectParams => new URLSearchParams(objectParams).toString();
Internet Explorer, , , https://www.npmjs.com/package/url-search-params-polyfill .
إذا كانت الشفرة تبدو مطولة ومربكة ، فربما تكون هناك طرق بسيطة لتحسينها.
وهناك أيضًا إمكانية تنفيذ الوظيفة التي تحتاجها على مستوى واجهة برمجة تطبيقات الويب.