Select an item from the sidebar to view content.
Создайте собственный дизайн веб-сайта, чтобы он соответствовал имиджу вашего бренда и потребностям бизнеса, а также повышал удобство использования и привлекательность.
Создайте веб-сайт, который адаптируется к нескольким устройствам, будь то настольный компьютер, планшет или мобильный телефон, чтобы обеспечить наилучшие впечатления от просмотра.
Поддерживает полные функции электронной коммерции, включая отображение продуктов, систему корзины покупок, интеграцию онлайн-платежей и т. д., что помогает вам легко продавать онлайн.
Создайте стабильную и эффективную серверную систему, включая управление базами данных, интеграцию API и настройку сервера, чтобы обеспечить бесперебойную работу веб-сайта.
Выполните оптимизацию скорости и SEO-оптимизацию веб-сайта, улучшите производительность веб-сайта и его рейтинг в поисковых системах, а также привлеките больше трафика.
Предоставляйте услуги по регулярному обслуживанию веб-сайта и обновлению контента для обеспечения его безопасности и актуальности информации.
Мы оказываем техническую поддержку в любое время, решаем проблемы и предоставляем профессиональные консультации, которые помогут вам повысить эффективность работы вашего сайта.
HTML (язык гипертекстовой разметки) — это основной стандартный язык для создания веб-страниц. Он отвечает за определение структуры и содержания веб-страниц, объединение текста, изображений, ссылок и другого мультимедиа с помощью различных тегов.
Стандартный HTML-элемент состоит из начального тега, содержимого и закрывающих тегов. Например:<p>Это текст</p>. Теги могут быть вложены в иерархическую древовидную структуру DOM.
Теги могут содержать атрибуты, предоставляющие дополнительную информацию. Общие свойства включают в себя:
| Имя свойства | Инструкция по применению |
|---|---|
| href | Определяет целевой URL-адрес ссылки. |
| src | Определите исходный путь изображений или мультимедиа. |
| alt | Альтернативный текст, когда изображение не может быть отображено. |
| class / id | Используется для выбора стиля CSS или операций JavaScript. |
Современный HTML подчеркивает семантику и использует такие теги, как заголовок, нижний колонтитул, статья, навигация и т. д. Это не только помогает в поисковой оптимизации (SEO), но также улучшает читаемость и доступность ваших веб-страниц.
HTML отвечает за структуру контента, CSS — за визуальный стиль, а JavaScript — за интерактивное поведение. Сочетание этих трех факторов может создать современное и полноценное веб-приложение.
Ниже перечислены стандартные названия веб-цветов, поддерживаемые HTML. Эти имена можно использовать непосредственно в атрибутах CSS или HTML, и браузер автоматически преобразует их в соответствующие числовые значения.
| Предварительный просмотр цвета | Английское имя | Шестнадцатеричный код |
|---|---|---|
| Black | #000000 | |
| White | #FFFFFF | |
| Red | #FF0000 | |
| Blue | #0000FF | |
| Yellow | #FFFF00 | |
| Lime | #00FF00 | |
| Cyan / Aqua | #00FFFF | |
| Magenta / Fuchsia | #FF00FF |
| Предварительный просмотр | имя | код |
|---|---|---|
| LightGray | #D3D3D3 | |
| Silver | #C0C0C0 | |
| DarkGray | #A9A9A9 | |
| Gray | #808080 | |
| DimGray | #696969 | |
| SlateGray | #708090 |
| Orange | #FFA500 | |
| Gold | #FFD700 | |
| Khaki | #F0E68C | |
| Chocolate | #D2691E | |
| SaddleBrown | #8B4513 |
JavaScript — это эффективный, гибкий и динамичный язык сценариев, который широко используется во внешней и внутренней разработке. Ниже приведены основные возможности JavaScript:
JavaScript — это динамически типизированный язык, и переменным не требуется указывать типы данных при их объявлении. Это означает, что тип переменной может динамически меняться во время выполнения программы.
пусть значение = 10; // инициализируется числовым типом
значение = «Привет»; // можно изменить на строковый тип
JavaScript поддерживает объектную ориентацию и используетпрототипное наследованиеспособ реализации наследования и повторного использования объектов. Это позволяет JavaScript более гибко определять объекты и манипулировать ими.
let person = {
name: "Alice",
greet: function() {
return "Hello, " + this.name;
}
};
В JavaScript функции также являются объектами, которые можно передавать как параметры, возвращать или присваивать переменным. Эта функция поддерживает множество шаблонов функционального программирования.
функция приветствие (имя) {
вернуть «Привет» + имя;
}
пусть говорятПривет = приветствие;
console.log(sayHello("Алиса")); // Функции можно использовать как переменные
JavaScript изначально поддерживает асинхронные операции, особенно черезPromiseиasync/awaitДелает обработку асинхронного поведения более интуитивно понятной. Это полезно для обработки асинхронных операций, таких как сетевые запросы и события синхронизации.
async function fetchData() {
const response = await fetch("https://api.example.com/data");
const data = await response.json();
console.log(data);
}
fetchData();
Первоначально JavaScript использовался для фронтенд-разработки в веб-браузерах, но в настоящее время широко используется при внутренней разработке (например, Node.js), настольных приложениях, мобильных приложениях и даже устройствах Интернета вещей.
Гибкость и разнообразие JavaScript делают его одной из основных технологий современной веб-разработки и обеспечивают мощную поддержку в различных областях применения.
В JavaScript Boolean — это базовый тип данных, имеющий только два возможных состояния или значения:
true: Олицетворяет истину, да, открытие или успех.false: представляет ложь, нет, закрыто или не удалось.Логическое значение является основой для всех логических суждений и управления процессами, напримерif...elseОператоры и циклы.
Вы можете присваивать логические значения непосредственно переменным или использовать операторы сравнения для получения логических значений.
пусть isLogged = true;
пусть isGuest = ложь;
// Оператор сравнения вернет логическое значение
пусть isGreater = (10 > 5); // правда
пусть isEqual = (5 === '5'); // false (потому что типы данных разные)
Это наиболее распространенное использование значений Боллинджера.ifОператор проверяет, является ли результат выражения в скобкахtrue, а затем решает, выполнять ли этот блок кода.
пусть возраст = 20;
если (возраст >= 18) {
console.log("Я взрослый и могу голосовать.");
} еще {
console.log("Несовершеннолетний.");
}
пусть userValid = checkUserStatus(); // Предполагаем, что возвращаем true или false
если (userValid) {
// если userValid true
displayDashboard();
} еще {
// если userValid имеет значение false
показатьLoginError();
}
Логические операторы используются для объединения или инвертирования логических значений. Существует три основных типа:
!(НЕ): логическое отрицание, инвертирование логического значения.&&(И): Логическое И, только если обе стороныtrueТолько тогда сообщение будет возвращеноtrue。||(ИЛИ): Логическое ИЛИ, если одна сторонаtrueПросто отправь обратноtrue。пусть isLoggedIn = true;
пусть hasPermission = ложь;
// ! (НЕ)
пусть isNotLoggedIn = !isLoggedIn; // ложь
// && (И)
если (isLoggedIn && hasPermission) {
console.log("Пользователь вошел в систему и имеет разрешения.");
}
// || (ИЛИ)
если (isLoggedIn || isGuest) {
console.log("Для продолжения просто войдите в систему или станьте гостем.");
}
JavaScript позволяет использовать другие типы данных, где требуются логические значения, и выполняются неявные преобразования. Эти значения будут трактоваться какtrueилиfalse:
falseценить):В условном суждении следующие шесть значений будут расцениваться какfalse:
false(само значение Боллинджера)0(ноль)""или''(пустая строка)nullundefinedNaN (Not a Number)trueценить):**Все остальные значения**, кроме шести упомянутых выше значений Falsy, в том числе:
"0"(непустая строка)"false"(непустая строка)1, -100)[]{}let myString = «Привет»;
пусть мойНомер = 0;
если (myString) {
// myString — это «Hello», что является значением Truthy и будет выполнено
console.log("Строка не пуста.");
}
если (мойномер) {
// myNumber равен 0, что является значением Falsy и не будет выполнено.
console.log("Число ненулевое.");
}
если ({}) {
// Пустой объект {} является значением Truthy и будет выполнен
console.log("Объект уже существует.");
}
Массив JavaScript (Array) — это переменная, используемая для хранения нескольких значений. Каждое значение в массиве называется элементом, и каждый элемент имеет числовой индекс (Index), начиная с 0.
// Создаем массив
let Fruits = ["Яблоко", "Банан", "Вишня", "Финика"];
//Доступ к элементам массива
console.log(фрукты[0]); // Вывод: Apple
console.log(fruits.length); // Вывод: 4
//Добавляем элементы в конец массива
Fruits.push("Бузина");
console.log(фрукты); // Вывод: ["Яблоко", "Банан", "Вишня", "Финик", "Бузина"]
//удаляем хвостовой элемент массива
пусть LastFruit = Fruits.pop();
console.log(lastFruit); // Выход: Бузина
console.log(фрукты); // Вывод: ["Яблоко", "Банан", "Вишня", "Дата"]
slice()Метод возвращает новый массив, содержащий выбранные элементы из исходного массива. Он не изменяет исходный массив.
грамматика:array.slice(start, end)
start(необязательно): начальный индекс для получения (включительно). Если не указано, начинается с индекса 0.end(необязательно): Конечный индекс поиска (не включен). Если не указано, получить до конца массива.пусть числа = [10, 20, 30, 40, 50, 60, 70]; // Начинаем с индекса 2 (30) и заканчиваем пусть срез1 = Numbers.slice(2); console.log(slice1); // Вывод: [30, 40, 50, 60, 70] // Начиная с индекса 1 (20) и до индекса 4 (50) пусть срез2 = Numbers.slice(1, 4); console.log(slice2); // Вывод: [20, 30, 40] // Используйте отрицательные индексы: -1 указывает на последний элемент, -3 указывает на третий-последний элемент (50) пусть срез3 = Numbers.slice(-3, -1); console.log(slice3); // Вывод: [50, 60] //копируем весь массив пусть copy = Numbers.slice(); console.log(копия); // Вывод: [10, 20, 30, 40, 50, 60, 70] console.log(числа); // Исходный массив не был изменен
Следующая функция предоставляет эффективный способ случайного выбора указанного количества элементов (например, 5) из массива. Этот метод гарантирует, что выбранные элементы не повторяются.
/**
* Случайным образом выбрать указанное количество элементов из массива
* @param {Array} исходный массив
* @param {number} count Количество элементов, которые нужно выбрать (по умолчанию — 5)
* @returns {Array} Новый массив, содержащий случайно выбранные элементы.
*/
функция getRandomElements(arr, count = 5) {
// Если элементы массива меньше или равны требуемому числу, возвращаем копию массива
если (объем. длина<= count) {
return arr.slice();
}
// 建立一個原始陣列的副本,用於隨機選取
let tempArray = arr.slice();
let result = [];
for (let i = 0; i < count; i++) {
// 隨機產生一個索引
let randomIndex = Math.floor(Math.random() * tempArray.length);
// 將選中的元素加入結果陣列
result.push(tempArray[randomIndex]);
// 將選中的元素從 tempArray 中移除,確保不會重複選取
tempArray.splice(randomIndex, 1);
}
return result;
}
let largeArray = [
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T"
];
let randomFive = getRandomElements(largeArray, 5);
console.log(randomFive); // 輸出範例: ["P", "A", "H", "R", "M"] (每次執行結果不同)
В разработке JavaScript существует несколько распространенных способов определить, существует ли значение в массиве. Какой метод выбрать, зависит от того, нужен ли вам только «результат логического значения» или вам нужно получить «индексную позицию» или «содержимое объекта» элемента.
Это наиболее рекомендуемая стандартная практика после ES6, с наиболее четкой семантикой и прямым возвратом true или false.
const fruits = ['apple', 'banana', 'orange'];
const hasApple = fruits.includes('apple'); // true
Используйте в старых браузерах или когда вам нужно узнать положение элемента. Если он существует, верните значение индекса (начиная с 0), если нет, верните -1.
const tags = ['js', 'php', 'css'];
if (tags.indexOf('php') !== -1) {
//Логика существования элемента
}
Используйте некоторые, когда члены массива являются объектами или вам нужно проверить, основываясь на конкретной логике, а не на точных значениях. Если один из членов соответствует условию, будет возвращено значение true.
const users = [
{ id: 101, name: 'Alex' },
{ id: 102, name: 'Bob' }
];
const exists = users.some(user => user.id === 101); // true
| нуждаться | Предлагаемый метод | Пример постбэка |
|---|---|---|
| Найдите первого квалифицированного участника | find() | { id: 101, имя: «Алекс» } или неопределенное |
| Найдите первый индекс, соответствующий критериям | findIndex() | 0 или -1 |
| Найдите всех подходящих участников | filter() | [соответствие 1, совпадение 2] или [] |
Если вам необходимо часто проверять наличие элементов в очень большом наборе данных, рекомендуется преобразовать массив в объект Set. Сложность запроса метода Set has составляет O(1), что намного быстрее, чем O(n) массива.
const HugeArray = [/* Большой объем данных */];
const mySet = новый набор (hugeArray);
если (mySet.has('targetValue')) {
// быстрый удар
}
Вы можете использоватьconcatМетод объединения двух массивов:
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let result = arr1.concat(arr2);
console.log(result); // [1, 2, 3, 4, 5, 6]
Использование оператора распространения также является распространенным способом:
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let result = [...arr1, ...arr2];
console.log(result); // [1, 2, 3, 4, 5, 6]
Если вы хотите добавить элементы второго массива в первый массив, вы можете объединитьpushИ оператор распространения:
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
arr1.push(...arr2);
console.log(arr1); // [1, 2, 3, 4, 5, 6]
Воляconsole.log('op_panel_htm()')Измените, чтобы динамически получать имя функции и выводить его, напримерconsole.log(get_curr_method_name())。
функция get_curr_method_name() {
константный стек = новая ошибка().стек;
constlines = stack.split("\n");
// Строка 0 — это ошибка, строка 1 — get_curr_method_name, строка 2 — функция, которая его вызывает
const callerLine = линии[2] || '';
const match = callerLine.match(/at (.+?) \(/);
ответный матч? match[1] : 'анонимный';
}
TableOperator.prototype.op_panel_htm = function () {
console.log(get_curr_method_name());
};
Если вы выполните следующее:
const t = new TableOperator();
t.op_panel_htm();
Это может быть выведено на консоль:
TableOperator.op_panel_htm
Фактический вывод зависит от формата стека браузера. Chrome/Edge обычно выводит полный путь к функции.
Error().stack, формат разных браузеров немного отличается.Его можно инкапсулировать в специальную функцию отладки:
function debug_log(msg = '') {
console.log(`[${get_curr_method_name()}] ${msg}`);
}
Как использовать:
debug_log("Инициализация завершена");
Результаты вывода следующие:
Инициализация [TableOperator.op_panel_htm] завершена
Когда проект JavaScript становится большим и имеет множество функций, следует использовать модульность и классификацию для улучшения удобства сопровождения и читаемости. Ниже объясняется, как эффективно управлять несколькими функциями, в том числе следует ли использоватьclass。
Сохраняйте связанные функции в разных файлах в соответствии с функциональной классификацией, например:
/utils/mathUtils.js → Функции, связанные с математическими операциями
/utils/domUtils.js → Функция работы с DOM
/modules/tableOperator.js → Классы или функции, связанные с операциями с таблицами
Каждый файл используетexport / importграмматика:
// mathUtils.js
export function add(a, b) {
return a + b;
}
// main.js
import { add } from './utils/mathUtils.js';
console.log(add(2, 3));
Более структурно было бы обернуть функции со связанной логикой в объект или класс, например:
// domUtils.js
export const DomUtils = {
createElement(tag) {
return document.createElement(tag);
},
removeElement(el) {
el.parentNode.removeChild(el);
}
};
Или используйте класс:
// tableOperator.js
export class TableOperator {
constructor(tableId) {
this.table = document.getElementById(tableId);
}
highlightRow(index) {
// ...
}
sortByColumn(colIndex) {
// ...
}
}
Если это просто функция инструмента (например, обработка строк, математические операции), рекомендуется использоватьexport functionилиexport const obj = { ... }Просто справьтесь.
/src
/utils
stringUtils.js
mathUtils.js
/components
tableOperator.js
chartViewer.js
main.js
в JavaScriptclassИспользует аналогично другим языкам ООП, включая конструкторы.constructor, переменные-члены и определения методов (функций).
класс Человек {
//Переменные-члены (публичные)
имя;
возраст;
//Конструктор
конструктор(имя, возраст) {
это.имя = имя;
this.age = возраст;
}
//Метод-член
приветствие () {
console.log(`Привет, меня зовут ${this.name} и в этом году мне ${this.age}`);
}
// Статический метод (нет необходимости создавать экземпляр)
статический вид() {
вернуть «человек»;
}
}
const p = новый человек("Сяо Мин", 25);
п.приветствие(); // Вывод: Здравствуйте, я Сяо Мин, в этом году мне исполнилось 25 лет.
console.log(p.name); // Сяо Мин
console.log(Person.species()); // Человек
this.name, доступ к которому возможен извне.класс Счетчик {
#счет = 0; // Частная переменная
приращение() {
это.#count++;
console.log(this.#count);
}
#секрет() {
console.log("Это частный метод");
}
раскрытьсекрет() {
это.#секрет(); // Можно вызвать внутри
}
}
класс Животное {
говорить() {
console.log("Издать звук");
}
}
класс Dog расширяет Animal {
говорить() {
console.log("Гав-гав!");
}
}
в методе классаthisУкажите на этот экземпляр. Но если он используется в событиях или обратных вызовах, используйтеbind()или функция стрелки для обеспечения наведения.
класс Кнопка {
конструктор() {
this.label = "Нажмите";
document.addEventListener("click", this.handleClick.bind(this));
}
handleClick() {
console.log(`Вы нажали ${this.label}`);
}
}
Классы JavaScript обеспечивают инкапсуляцию, наследование, поддержку методов и атрибутов, как и другие языки. Они подходят для средних и крупных проектов, а также легко интегрируются с модулями. Если вам нужен более строгий набор текста и контроль, рассмотрите возможность использования TypeScript.
Модули JavaScript (модули) предоставляют возможность инкапсулировать переменные и функции в файлы. Вы можете использоватьimport/exportМеханизм аналогиченclassРазделение труда и функции структурирования подходят для инструментальных функций или отдельных функциональных логических единиц.
| Функция | class | module |
|---|---|---|
| Инкапсуляция данных и поведения | ✅ | ✅(через экспортный пакет) |
| возможность создания экземпляров | ✅ | ❌(Существует как синглтон) |
| Наследование и политип | ✅ | ❌(Требуется ручное управление) |
| единственный функциональный компонент | Может | более подходящий |
// file: mathUtils.js
export const MathUtils = {
add(a, b) {
return a + b;
},
multiply(a, b) {
return a * b;
}
};
// file: main.js
import { MathUtils } from './mathUtils.js';
console.log(MathUtils.add(3, 4)); // 7
console.log(MathUtils.multiply(2, 5)); // 10
// file: stringHelper.js
export function toUpper(str) {
return str.toUpperCase();
}
export function truncate(str, len) {
return str.length > len ? str.slice(0, len) + '…' : str;
}
// file: main.js
import { toUpper, truncate } from './stringHelper.js';
console.log(toUpper("hello")); // HELLO
console.log(truncate("JavaScript", 5)); // JavaS…
// file: config.js
let config = {
env: "dev",
version: "1.0"
};
export function getConfig() {
return config;
}
export function setEnv(env) {
config.env = env;
}
// file: app.js
import { getConfig, setEnv } from './config.js';
console.log(getConfig()); // { env: "dev", version: "1.0" }
setEnv("prod");
console.log(getConfig()); // { env: "prod", version: "1.0" }
Модули подходят для инкапсуляции функций инструмента, констант и настроек, а такжеclassДругое дело, что модульОн автоматически выполняется при загрузке и уникален на всем домене., очень подходит для логической классификации и аккуратной структуры программы. Используйте, когда вам нужны экземпляры объектов, которые можно создавать несколько раз, или объектно-ориентированное наследование.classБолее подходящий.
function runExclusive(fn) {
let last = Promise.resolve();
return function (...args) {
last = last.then(() => fn(...args));
return last;
};
}
асинхронная функция doTask(имя) {
console.log(`Запустить ${name}`);
дождитесь нового обещания (решить => setTimeout (решить, 2000));
console.log(`Конец ${name}`);
}
const doTaskOnce = runExclusive(doTask);
// Вызов несколько раз одновременно
doTaskOnce("А");
doTaskOnce("Б");
doTaskOnce("С");
Start A
End A
Start B
End B
Start C
End C
Чтобы сохранить определенный элемент HTML на веб-странице (например, $\lt$table$\gt$) в виде локального файла $\text{.html}$, вам обычно необходимо использовать JavaScript для получения HTML-кода элемента, а затем запустить процесс сохранения через API загрузки браузера. Это клиентское решение.
Используйте селектор $\text{document.getElementById}$ или $\text{document.querySelector}$, чтобы получить элемент $\lt$table$\gt$, который вы хотите сохранить, и получить его $\text{outerHTML}$.
var tableElement = document.getElementById('myTableId');
var tableHtml = tableElement.outerHTML;
Одного кода $\lt$table$\gt$ недостаточно для формирования полного файла $\text{.html}$. Вам необходимо обернуть его в базовые теги $\lt$html$\gt$, $\lt$head$\gt$ и $\lt$body$\gt$, чтобы гарантировать, что архив открывается и корректно отображается в браузере. Вам также следует включить все необходимые теги $\lt$style$\gt$ или $\lt$link$\gt$, чтобы сохранить стиль таблицы (CSS).
var fullHtml = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Сохраненная таблица</title></head><body>' + tableHtml + '</body></html>';
Объекты Blob (большие двоичные объекты) используются для хранения двоичных или подобных двоичным данным данных. Мы конвертируем строку, содержащую полный HTML-код, в $\text{Blob}$ типа $\text{text/html}$.
var blob = new Blob([fullHtml], { type: 'text/html' });
Используйте $\text{URL.createObjectURL}$, чтобы создать локальный $\text{URL}$, указывающий на $\text{Blob}$, и присвойте его атрибуту $\text{href}$ элемента $\lt$a$\gt$, а также установите атрибут $\text{download}$, чтобы указать имя загруженного файла.
var a = document.createElement('a');
a.href = URL.createObjectURL(BLOB);
a.download = 'exported_table.html'; //Указываем имя скачанного файла
а.клик(); // Имитируем щелчок и вызываем диалоговое окно загрузки
// Освобождаем ресурсы
URL.revokeObjectURL(a.href);
Если стили таблиц были добавлены динамически через внешний файл $\text{CSS}$ или $\text{JavaScript}$ на странице, простое сохранение $\text{outerHTML}$ может привести к потере этих стилей или функций. Чтобы решить эту проблему:
Эмулировать C/С++#ifdef DEBUGМеханизм условной компиляции для достижения контролируемой производительности в JavaScriptdebug_log(), контролировать уровень вывода и переключение журнала в зависимости от стадии разработки (в разработке, тестирования, официальной версии).
// 0 = нет вывода, 1 = ошибка, 2 = предупреждение, 3 = сообщение, 4 = отладка
константный LOG_LEVEL = 3;
функция debug_log(msg, уровень = 3) {
если (уровень<= LOG_LEVEL) {
const name = get_curr_method_name();
console.log(`[${name}] ${msg}`);
}
}
function get_curr_method_name() {
const stack = new Error().stack;
const lines = stack.split("\n");
const callerLine = lines[2] || '';
const match = callerLine.match(/at (.+?) \(/);
return match ? match[1] : 'anonymous';
}
функция initApp() {
debug_log("Инициализация", 4); // Уровень отладки
debug_log("Настройки успешно загружены", 3); // Сообщение
debug_log("Значение настройки может быть слишком старым", 2); // Предупреждение
debug_log("Загрузка не удалась", 1); // Ошибка
}
LOG_LEVEL = 4(широко открыт)LOG_LEVEL = 2(Отображаются только ошибки и предупреждения)LOG_LEVEL = 0(полная тишина)При использовании с такими инструментами, как Webpack/Vite/ESBuild, можно использовать условные константы.process.env.NODE_ENVУдалить журналы:
if (process.env.NODE_ENV === 'разработка') {
debug_log("Сообщения в среде разработки");
}
Его также можно использовать с плагинами Babel (например, Babel-plugin-transform-remove-console) для удаления всехconsole.*。
Хотя JavaScript не имеет условной компиляции, он может достичь уровня отладки и механизма управления выпуском, аналогичного C++, за счет стратегий управления переменными и оптимизации упаковки, чтобы гарантировать, что информация на этапе разработки является полной, а официальная версия является чистой и свободной от шума.
Консоль браузера является частью инструментов разработчика и используется для:
F12илиCtrl + Shift + I→ Нажмите на вкладку «Консоль».Cmd + Option + Iconsole.log("Сообщение"):Распечатать сообщение$0: выберите выбранный в данный момент элемент на панели «Элементы».document.querySelector():Выбрать элементы DOMdir(obj): Список свойств объектаcopy(obj): Копировать переменные в буфер обмена.//Печать сообщения
console.log("Привет, консоль");
// Получаем элементы страницы и работаем
const btn = document.querySelector("кнопка");
btn.textContent = "Новая метка";
кнопка.клик();
//Просмотр объекта
console.dir(BTN);
---
Если в Консоли появляется следующее сообщение, это означает, что Chrome запрещает прямую вставку многострочного кода из соображений безопасности:
Don’t paste code into the DevTools Console ... Please type ‘allow pasting’ below and press Enter
входитьallow pastingи нажмите Enter, чтобы снять ограничение.
clear():Очистить сообщения консоли.inspect(element): перейти непосредственно на панель «Элементы», чтобы найти элемент.$и$$:даquerySelectorиquerySelectorAllаббревиатураПо соображениям безопасности и для предотвращения публикации опасного кода вредоносными веб-сайтами или другими лицами Chrome по умолчанию запрещает вставку многострочного кода непосредственно в консоль.
Появляется сообщение:
Warning: Don’t paste code into the DevTools Console that you don’t understand or haven’t reviewed yourself.
This could allow attackers to steal your identity or take control of your computer.
Please type ‘allow pasting’ below and press Enter to allow pasting.
---
allow pasting(без кавычек)// 1. В консоли введите разрешение вставки и нажмите Enter.
разрешить вставку
// 2. Вставьте код JavaScript, который хотите выполнить.
const хост = document.querySelector('i18n-message[key="login.button.loginWithLine"]');
// ...(следующий код)
---
<script>
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
document.getElementById("result").innerHTML = xhr.responseText;
}
};
xhr.open("GET", "data.php", true);
xhr.send();
</script>
<скрипт>
вар xhr = новый XMLHttpRequest();
xhr.open("POST", "submit.php", true);
xhr.setRequestHeader("Тип контента", "application/x-www-form-urlencoded");
xhr.onreadystatechange = функция() {
if (xhr.readyState === 4 && xhr.status === 200) {
alert("Ответ сервера: " + xhr.responseText);
}
};
xhr.send("name=Сяо Мин&score=90");
</скрипт>
<скрипт>
вар xhr = новый XMLHttpRequest();
xhr.open("GET", "data.json", true);
xhr.onreadystatechange = функция() {
if (xhr.readyState === 4 && xhr.status === 200) {
вар json = JSON.parse(xhr.responseText);
console.log("Имя: " + json.name);
}
};
xhr.отправить();
</скрипт>
$.ajax({
URL: "data.php",
метод: «ПОЛУЧИТЬ»,
успех: функция (ответ) {
$("#result").html(ответ);
},
ошибка: функция (xhr) {
alert("Ошибка: " + xhr.status);
}
});
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = функция() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
console.log("Содержимое ответа: " + xmlhttp.responseText);
}
};
xmlhttp.open("GET", "api/data.php", true);
xmlhttp.send();
xmlhttp.open("POST", "api/save.php", true);
xmlhttp.setRequestHeader("Тип контента", "application/x-www-form-urlencoded");
xmlhttp.send("name=test&value=123");
xmlhttp.onreadystatechange = функция() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
данные var = JSON.parse(xmlhttp.responseText);
console.log("Состояние: " + data.status);
}
};
<скрипт>
вар xmlhttp = новый XMLHttpRequest();
xmlhttp.onreadystatechange = функция() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
попробуй {
вар json = JSON.parse(xmlhttp.responseText);
console.log("Данные успешно получены:", json);
} поймать (е) {
console.error("Возвращённое содержимое не является допустимым JSON", xmlhttp.responseText);
}
}
};
xmlhttp.open("GET", "data.php", true);
xmlhttp.send();
</скрипт>
error_reporting(0)Отключите вывод ошибок.
<br />
<b>Deprecated</b>: Facebook\FacebookApp implements the Serializable interface...
...
{ "status": "ok", "data": [...] }
error_reporting(0);
ini_set('display_errors', 0);Это не позволяет PHP выводить сообщения об ошибках или предупреждения.<?php
error_reporting (0);
ini_set('display_errors', 0);
заголовок('Тип контента: приложение/json');
// Предположим, что это данные, которые нужно вернуть
$data = ["статус" => "ок", "значение" => 123];
эхо json_encode ($ данные);
Выход;
?>
composer update facebook/graph-sdkИли проверьте требования к версии в композиторе.json, чтобы использовать версию, совместимую с PHP 8.1.пусть ответ = xmlhttp.responseText;
пусть jsonStart = response.indexOf("{");
если (jsonStart >= 0) {
пусть jsonStr = response.substring(jsonStart);
пусть json = JSON.parse(jsonStr);
//Используем json для обработки данных
}
<div id="msg"></div>
<скрипт>
let name = «Сяо Мин»;
document.getElementById("msg").textContent = name;
</скрипт>
<div id="box"></div>
<скрипт>
пусть цвет = «красный»;
document.getElementById("box").innerHTML =
`<p style="color:${color}">Цвет текста: ${color}</p>`;
</скрипт>
<a id="link">ссылка</a>
<input id="nameInput">
<скрипт>
пусть URL = "https://example.com";
let name = "Сяохуа";
document.getElementById("ссылка").href = URL;
document.getElementById("nameInput").value = name;
</скрипт>
<img id="аватар" alt="аватар пользователя">
<скрипт>
пусть источник изображения = "https://example.com/avatar.png";
document.getElementById("avatar").setAttribute("src", источник изображения);
</скрипт>
<div id="card"></div>
<скрипт>
пусть userID = 456;
document.getElementById("card").dataset.userid = идентификатор пользователя; // Будет соответствовать data-userid="456"
</скрипт>
<a id="myLink">Ссылка</a>
<input id="myInput">
<скрипт>
пусть URL = "https://example.com";
let name = «Сяо Мин»;
document.getElementById("myLink").href = URL;
document.getElementById("myInput").value = name;
</скрипт>
<img id="аватар">
<скрипт>
пусть источник изображения = "https://example.com/avatar.png";
document.getElementById("avatar").setAttribute("src", источник изображения);
</скрипт>
<div id="card"></div>
<скрипт>
пусть имя пользователя = 123;
document.getElementById("card").dataset.userid = код пользователя; // Будет соответствовать data-userid="123"
</скрипт>
<div id="container"></div>
<скрипт>
let title = "динамический заголовок";
document.getElementById("контейнер").innerHTML =
`<h3 data-title="${title}">${title}</h3>`;
</скрипт>
В следующем примере будет добавлен<div class="abc">Дочерние элементы:
// Предположим, что есть родительский элемент
const родительский = document.getElementById("myParent");
//Создаем элемент div
const child = document.createElement("div");
// Установить класс
child.className = "abc"; // или используйте classList.add("abc");
//Добавляем к родительскому элементу
родитель.appendChild(ребенок);
<div id="myParent"></div>
<скрипт>
const родительский = document.getElementById("myParent");
const child = document.createElement("div");
child.className = "abc";
child.textContent = "Это новый DIV";
родитель.appendChild(ребенок);
</скрипт>
child.classList.add("abc", "def")id、style、datasetхарактеристикибудет внутри#myParentПоявляется в:
<div class="abc">Это новый элемент DIV</div>
querySelectorAll()Используйте синтаксис селектора CSS, чтобы выбрать все элементы, соответствующие критериям, и вернуть статическое значение.NodeList。
// Выбрать все <div> с категорией «предмет»
let items = document.querySelectorAll("div.item");
// Используйте forEach для перебора результатов
items.forEach(item => {
item.style.color = "синий";
});
иquerySelectorAll()Аналогично, но вернет только «первый» элемент, соответствующий критериям. Если не найден, вернитеnull。
// Выбираем первый элемент с идентификатором "main-title"
let title = document.querySelector("#main-title");
// Выбираем первый <p> тег на странице
let firstPara = document.querySelector("p");
Это самый быстрый и прямой метод, предназначенный для выбора одного элемента по его уникальному идентификатору.
let header = document.getElementById("header-section");
Выберите элементы на основе названий категорий и верните «Live»HTMLCollection. Эта коллекция автоматически обновляется при изменении структуры DOM.
let button = document.getElementsByClassName("btn-submit");
// Примечание: вы не можете использовать forEach непосредственно в HTMLCollection, вам необходимо сначала преобразовать его в массив
Array.from(buttons).forEach(btn => console.log(btn));
Выбирайте элементы на основе имен тегов (например, div, p, span), а также возвращайте мгновенный результат.HTMLCollection。
let allLinks = document.getElementsByTagName("a");
console.log("На странице всего " + allLinks.length + " ссылок");
| метод | Тип постбэка | Тип параметра | производительность |
|---|---|---|---|
| querySelector | Одиночный элемент | CSS-селекторы | обычный |
| querySelectorAll | Список узлов (статический) | CSS-селекторы | обычный |
| getElementById | Одиночный элемент | Идентификатор строки | самый быстрый |
| getElementsByClassName | HTMLCollection (мгновенно) | строка категории | быстрый |
querySelectorAllвернулсяNodeListЯвляется статическим, что означает, что содержимое манифеста не изменится, даже если элемент позже будет удален из DOM. иgetElementsBy...Серия вернуласьHTMLCollectionОн динамичен и в любое время будет отражать последнее состояние DOM.
Если вы хотите выбрать элементы, которые одновременно удовлетворяют нескольким условиям, просто расположите селекторы близко друг к другу, не оставляя промежутков между ними.
// Выбираем элементы, категория которых содержит как «btn», так и «primary».
let PrimaryButtons = document.querySelectorAll(".btn.primary");
// Выбираем <li> тег с классом «предмет»
пусть listItems = document.querySelectorAll("li.item");
Если вы хотите выбрать все элементы, соответствующие условию А или условию Б, используйте «запятую»,Отдельные разные селекторы.
// Выбрать все <h1> и все <h2>
let headers = document.querySelectorAll("h1, h2");
// Выбираем элементы с категорией «активный» или элементы с категорией «выделенный»
let маркеры = document.querySelectorAll(".active, .highlight");
Фильтрация по наличию или значению атрибута HTML. Это полезно при работе с формами или пользовательскими свойствами данных.
// Выбрать все <button> с атрибутом «отключено»
let DisableBtns = document.querySelectorAll("button[disabled]");
// Выбрать все <input> атрибут имени которого начинается с «пользователя» (используйте ^=)
let userInputs = document.querySelectorAll("input[name^='user']");
// Выбираем все элементы, атрибут типа данных которых точно равен «видео»
let videos = document.querySelectorAll("[data-type='video']");
Используйте структурные связи между элементами для углубленного анализа.
// Селектор потомков: выбрать все <a> внутри #nav (независимо от уровня)
let navLinks = document.querySelectorAll("#nav a");
//Дочерний селектор: выберите элемент <div> непосредственно под .container (только первый слой)
let DirectDivs = document.querySelectorAll(".container > div");
// Селектор соседнего уровня: выбирает первый <p> сразу после <h1>
let firstParas = document.querySelectorAll("h1 + p");
Это чрезвычайно полезно при работе со списками или фильтрами состояний.
// Выбираем все четные столбцы в таблице (2-й, 4-й, 6-й...)
letevenRows = document.querySelectorAll("tr:nth-child(even)");
// Выбираем все флажки, которые в данный момент отмечены
letcheckBoxes = document.querySelectorAll("input[type='checkbox']:checked");
// Выбрать все <section> которые не имеют категории «скрыто» (используйте :not)
letvisibleSections = document.querySelectorAll("section:not(.hidden)");
Вы можете комбинировать все вышеперечисленные правила для создания сложных условий запроса.
// Выбрать все <div> в контейнере с идентификатором «main», классом «card» и атрибутом «data-id»
let complexQuery = document.querySelectorAll("#main div.card[data-id]");
// Выбираем оба первых <li> и последний <li>
let endpoints = document.querySelectorAll("li:first-child, li:last-child");
найтиcurrElemсначала после<footer>элементы, самый надежный способ — перебрать все<footer>элемент и использованиеNode.compareDocumentPosition()метод определения их относительногоcurrElemрасположение.
document.querySelectorAll('footer')Получить все элементы на странице<footer>элемент.<footer>элемент, вызовcurrElem.compareDocumentPosition(footer). Если результирующая битовая маска содержит $4$(NODE_FOLLOWING), это означает, что<footer>в порядке файловcurrElemпосле.<footer>, чтобы остановить перемещение.найти цель<footer>элемент, вы можете использовать современный интерфейс DOMElement.before()Вставьте новый контент перед этим элементом.
targetFooter.before(contentToAdd);
ВотcontentToAddМожет быть строкой (которая будет преобразована в текстовый узел) или одним или несколькими узлами/элементами DOM.
функция addContentBeforeNextFooter (currElem, contentToAdd) {
// 1. Получить все элементы нижнего колонтитула в файле
const allFooters = document.querySelectorAll('footer');
пусть nextFooter = null;
// 2. Проходим и находим первый нижний колонтитул после currElem
for (const footer allFooters) {
// Проверяем, следует ли нижний колонтитул за currElem (битовая маска 4)
// 4: Узел аргумента следует за ссылочным узлом.
if (currElem.compareDocumentPosition(нижний колонтитул) & 4) {
следующийFooter = нижний колонтитул;
перерыв; // Остановимся сразу после нахождения первого
}
}
// 3. Если целевой нижний колонтитул найден, вставьте содержимое перед ним
если (следующий нижний колонтитул) {
nextFooter.before(contentToAdd);
console.log('Содержимое было успешно вставлено перед первым нижним колонтитулом после currElem.');
вернуть следующий нижний колонтитул;
} еще {
console.log('После currElem не найден элемент нижнего колонтитула.');
вернуть ноль;
}
}
// Пример: создание контента для вставки
const newDiv = document.createElement('div');
newDiv.textContent = 'Это недавно вставленный контент. ';
// Предположим, что currElem — это полученный вами элемент DOM
// const currElem = document.getElementById('some-id');
// addContentBeforeNextFooter(currElem, newDiv);
Эта обновленная функцияfindNearestFooterПозволяет указать направление ('before'или'after'), чтобы найти ближайшийcurrElemиз<footer>элемент.
Node.compareDocumentPosition()битовая маска метода определения<footer>находится вcurrElemДо или после.'after'): Определить, содержит ли он бит $4$ (NODE_FOLLOWING)。
document.querySelectorAllУже отсортировано по порядку файлов, найден первый отвечающий условиям<footer>Это цель.'before'): Определить, содержит ли он бит $2$ (NODE_PRECEDING)。
document.querySelectorAllОн сортируется сверху вниз. Нам нужно пройти по списку в обратном направлении и найти первый, удовлетворяющий условиям.<footer>является самым близкимcurrElemВон тот./**
* Найдите первый <footer> элемент до или после currElem и вставьте содержимое до и после него.
* @param {HTMLElement} currElem — элемент, используемый в качестве опорной точки.
* @param {('before'|'after')} Direction — направление поиска («до» или «после»).
* @param {HTMLElement|string} contentToAdd — содержимое (элемент или строка), которое необходимо вставить.
* @returns {HTMLElement|null} — найден элемент нижнего колонтитула или значение NULL, если не найден.
*/
функция findNearestFooter (currElem, направление, contentToAdd) {
const allFooters = document.querySelectorAll('footer');
пусть ближайшийFooter = null;
если (направление === 'после') {
// Находим первый нижний колонтитул "после"
for (const footer allFooters) {
// 4 (NODE_FOLLOWING): нижний колонтитул после currElem
if (currElem.compareDocumentPosition(нижний колонтитул) & 4) {
ближайшийFooter = нижний колонтитул;
перерыв; // Остановимся при поиске первого, потому что он ближайший
}
}
//Вставляем контент (до того, как будет найден нижний колонтитул)
если (ближайшийFooter) {
ближайшийFooter.before(contentToAdd);
console.log('Содержимое было вставлено перед первым колонтитулом после currElem.');
}
} else if (направление === 'до') {
// Находим первый нижний колонтитул «до»
// Вам нужно пройти назад от конца списка, чтобы найти нижний колонтитул, ближайший к currElem
for (пусть я = allFooters.length - 1; я >= 0; я--) {
const footer = allFooters[i];
// 2 (NODE_PRECEDING): нижний колонтитул перед currElem
if (currElem.compareDocumentPosition(нижний колонтитул) & 2) {
ближайшийFooter = нижний колонтитул;
перерыв; // Остановимся, когда будет найден первый (первый при обратном обходе)
}
}
// Вставляем контент (после того, как найден нижний колонтитул)
// Поскольку наше требование — найти нижний колонтитул «до», содержимое обычно вставляется после нижнего колонтитула.
если (ближайшийFooter) {
// Чтобы соответствовать вашему предыдущему запросу (вставить перед нижним колонтитулом), мы по-прежнему будем предполагать, что перед
// Если требуется вставить "после" найденного футера, используйте ближайшийFooter.after(contentToAdd);
ближайшийFooter.before(contentToAdd);
console.log('Содержимое было вставлено перед первым нижним колонтитулом перед currElem.');
}
}
если (!nearestFooter) {
console.log(`В currElem не найден элемент нижнего колонтитула ${direction === 'before' ? 'before' : 'after'}.`);
}
вернуть ближайший нижний колонтитул;
}
// Пример: предположим, что currElem и contentToAdd определены
// const currElem = document.getElementById('some-reference');
// const newContent = document.createElement('p');
// newContent.textContent = 'Это вставленный контент';
// // Пример вызова: найти первый нижний колонтитул после currElem
// findNearestFooter(currElem, 'after', newContent.cloneNode(true));
// // Пример вызова: найти первый нижний колонтитул перед currElem
// findNearestFooter(currElem, 'before', newContent.cloneNode(true));
document.querySelectorAll()Возвращается **NodeList**. NodeList не является настоящим массивом JavaScript, но он имеетlengthатрибуты и числовые индексы, поэтому вы можете использоватьArray.from()или оператор распространения (Оператор распространения...), чтобы преобразовать его в массив, а затем использоватьArray.prototype.slice()Метод получения начального подмножества.
/**
* Получите первые 5 элементов коллекции, возвращенной querySelectorAll.
* @param {string} selector — строка селектора CSS.
* @returns {Массив} — Массив, содержащий первые 5 элементов (если элементов меньше 5, возвращаются все элементы).
*/
функция getFirstFiveElements(селектор) {
const nodeList = document.querySelectorAll(селектор);
// 1. Преобразовать NodeList в массив
const allElements = Array.from(nodeList);
// 2. Используйте срез(0, 5), чтобы получить первые 5 элементов
const firstFive = allElements.slice(0, 5);
вернуть firstFive;
}
//Пример использования:
// const topFiveDivs = getFirstFiveElements('div');
// console.log("Первые 5 элементов:", topFiveDivs);
Чтобы получить случайный элемент из коллекции, необходимо выполнить следующие действия:
Обычно наиболее эффективный способ — случайным образом отсортировать массив и затем выбрать пятерку лучших.
/**
* Случайным образом получить 5 элементов из коллекции, возвращаемой querySelectorAll.
* @param {string} selector — строка селектора CSS.
* @returns {Массив} — Массив, содержащий 5 случайных элементов (если элементов меньше 5, возвращаются все элементы).
*/
функция getRandomFiveElements (селектор) {
const nodeList = document.querySelectorAll(селектор);
// 1. Преобразовать NodeList в массив
пусть allElements = Array.from(nodeList);
// Если общее количество элементов меньше 5, возвращаем все элементы напрямую
если (allElements.length<= 5) {
return allElements;
}
// 2. 實作 Fisher-Yates (或稱 Knuth) 隨機排序法
// 這是一種高效且公平的隨機排列方法。
for (let i = allElements.length - 1; i >0; я--) {
// Генерируем случайный индекс j между 0 и i
const j = Math.floor(Math.random() * (i + 1));
// Меняем местами allElements[i] и allElements[j]
[allElements[i], allElements[j]] = [allElements[j], allElements[i]];
}
// 3. Получить первые 5 элементов случайно отсортированного массива
const randomFive = allElements.slice(0, 5);
вернуть случайную пятерку;
}
//Пример использования:
// const randomFiveImages = getRandomFiveElements('img');
// console.log("5 случайных элементов:", randomFiveImages);
Адаптивный веб-дизайн — это метод дизайна веб-сайта, который позволяет веб-сайту адаптироваться к размерам и разрешениям экранов различных устройств. Это означает, что содержимое веб-сайта автоматически настраивается для обеспечения наилучшего удобства независимо от того, используете ли вы его на мобильном телефоне, планшете или настольном компьютере.
Ключом к адаптивному дизайну являются гибкие макеты, изображения с возможностью изменения размера и медиазапросы CSS. Эти технологии позволяют веб-сайту автоматически изменять размер и располагать элементы в зависимости от ширины устройства.
Используйте медиа-запросы в CSS для настройки макета, например:
@media (max-width: 600px) { body { font-size: 14px; } }
Адаптивный дизайн может улучшить взаимодействие с пользователем, снизить затраты на разработку и повысить эффективность SEO. Адаптивные веб-страницы легче поддерживать, поскольку нет необходимости разрабатывать разные версии для каждого устройства.
JavaScript — это интерфейсный язык программирования, код которого загружается в браузер пользователя и выполняется, что упрощает его просмотр или копирование. Хотя полностью предотвратить реверс-инжиниринг кода невозможно, можно принять различные меры для повышения интенсивности защиты и реализации механизма авторизации для пробных и официальных версий.
Используйте инструменты для преобразования исходного кода в нечитаемый формат.
npm install -g javascript-obfuscator
javascript-obfuscator input.js --output output.js
Пример запутанного кода:
var _0x1a2b=["\x68\x65\x6C\x6C\x6F"];console[_0x1a2b[0]]("Hello World!");
Используйте инструменты сжатия, чтобы удалить пробелы и комментарии, чтобы уменьшить читаемость кода, например, используяUglifyJS。
Храните важную логику на сервере и предоставляйте услуги через API вместо того, чтобы выполнять их непосредственно во внешнем интерфейсе.
fetch('https://example.com/api').then(response => response.json()).then(data => console.log(data));
Добавьте на страницу механизм обнаружения, чтобы предотвратить использование инструментов разработчика.
document.addEventListener('keydown', (event) => {
if (event.key === 'F12' || (event.ctrlKey && event.shiftKey && event.key === 'I')) {
event.preventDefault();
}
});
Объедините логику пробной и рабочей среды с API, например проверку личности пользователя по кодам авторизации.
fetch('https://example.com/verify_license', {
метод: 'POST',
заголовки: { 'Content-Type': 'application/json' },
тело: JSON.stringify({ LicenseKey: userLicenseKey })
}).then(response => response.json()).then(data => {
если (data.valid) {
console.log('Официальная версия активирована');
} еще {
console.log('Ограниченные функции пробной версии');
}
});
Отключите определенные функции пробной версии, такие как доступность компонентов пользовательского интерфейса или доступ к данным.
Установите логику проверки пробного периода на основе даты первого использования пользователем.
const startDate = localStorage.getItem('startDate') || новая дата();
localStorage.setItem('startDate', startDate);
if (new Date() - new Date(startDate) > 14 * 24 * 60 * 60 * 1000) {
console.log('Пробный период закончился');
} еще {
console.log('во время пробного периода');
}
На веб-страницах отслеживание изменений положения прокрутки позволяет добиться множества динамических эффектов, таких как отображение кнопки возврата наверх, плавающей панели навигации и т. д. Прослушивание таких событий можно легко реализовать с помощью JavaScript.
В JavaScript это можно сделать черезwindow.addEventListener('scroll', handler)Метод для прослушивания событий прокрутки. Срабатывает при прокруткеhandlerфункция для выполнения соответствующей обработки.
В следующем примере отображается вертикальное положение прокрутки текущей страницы и ее отображение внизу страницы.
<скрипт>
//Определяем обработчик событий прокрутки
функция handleScroll() {
const ScrollPosition = window.scrollY; // Получаем позицию вертикальной прокрутки
document.getElementById("scrollPositionDisplay").textContent = "Текущая позиция прокрутки: " + ScrollPosition + " px";
}
//Добавляем прослушиватель событий прокрутки
window.addEventListener('scroll', handleScroll);
</скрипт>
<div id="scrollPositionDisplay" style="position: фиксированный; внизу: 20 пикселей; слева: 20 пикселей; цвет фона: #eee; отступ: 10 пикселей;">
Текущая позиция прокрутки: 0 пикселей
</div>
Добавление слишком большого количества операций в событие прокрутки может повлиять на производительность, рекомендуется использоватьrequestAnimationFrameилиsetTimeoutВыполните регулирование, чтобы уменьшить частоту срабатывания событий.
События, которые прослушивают изменения положения прокрутки, можно использовать для различных динамических эффектов, повышающих интерактивность веб-страниц. С помощью простого JavaScript можно отслеживать события прокрутки, чтобы улучшить взаимодействие с пользователем.
width: max-contentЭтот подход позволяет автоматически регулировать ширину элемента в зависимости от содержимого, оставаясь при этом на новой строке.
pre {
display: inline-block;
width: max-content;
}
Эффект:
Это текст.
Это блок кода.
float: leftЭтот метод используетfloatПереместите элемент влево и начните его с новой строки.
pre {
display: inline-block;
float: left;
}
Эффект:
Это текст.
Это блок кода.
::beforeвиртуальный элементИспользуйте виртуальные элементы, чтобы принудительно переносить элементы, сохраняя при этом адаптивную ширину.
pre {
display: inline-block;
}
pre::before {
content: '';
display: block;
clear: both;
}
Эффект:
Это текст.
Это блок кода.
white-space: preиспользоватьwhite-spaceУправляйте переносом строк, чтобы ширина блоков естественным образом адаптировалась к содержимому.
pre {
display: inline-block;
white-space: pre;
}
Эффект:
Это текст.
Это блок кода.
<!DOCTYPE html>
<html lang="en">
<голова>
<мета-кодировка="UTF-8">
<meta name="viewport" content="width=device-width, Initial-scale=1.0">
<title>Моделирование пользовательского интерфейса приложений Windows</title>
<стиль>
тело {
семейство шрифтов: «Segoe UI», Tahoma, Женева, Вердана, без засечек;
маржа: 0;
заполнение: 0;
цвет фона: #f0f0f0;
}
.app-окно {
ширина: 800 пикселей;
высота: 500 пикселей;
поле: 50 пикселей авто;
фон: #ffffff;
граница: 1 пиксель, сплошная #ccc;
радиус границы: 8 пикселей;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
переполнение: скрыто;
дисплей: гибкий;
гибкое направление: столбец;
}
.title-бар {
фон: #0078d7;
цвет: #ffffff;
отступ: 10 пикселей 15 пикселей;
дисплей: гибкий;
оправдание-содержание: пространство между;
выровнять-элементы: по центру;
}
.title-bar h1 {
размер шрифта: 16 пикселей;
маржа: 0;
}
.title-bar .buttons {
дисплей: гибкий;
разрыв: 5 пикселей;
}
.title-bar .buttons кнопка {
ширина: 20 пикселей;
высота: 20 пикселей;
фон: #ffffff;
граница: нет;
радиус границы: 50%;
курсор: указатель;
}
.title-bar .buttons кнопка: наведите {
фон: #e0e0e0;
}
.content {
гибкий: 1;
отступ: 15 пикселей;
переполнение: авто;
}
.сайдбар {
ширина: 200 пикселей;
фон: #f3f3f3;
правая граница: 1 пиксель сплошной #ddd;
отображение: встроенный блок;
вертикальное выравнивание: сверху;
}
.main-content {
отображение: встроенный блок;
ширина: расчет (100 % – 200 пикселей);
вертикальное выравнивание: сверху;
}
.сайдбар ул {
стиль списка: нет;
маржа: 0;
заполнение: 0;
}
.sidebar улли {
отступ: 10 пикселей 15 пикселей;
курсор: указатель;
нижняя граница: 1 пиксель сплошной #ddd;
}
.sidebar ul li:hover {
фон: #e9e9e9;
}
.main-content р {
маржа: 0;
заполнение: 0;
}
</стиль>
</голова>
<тело>
<div class="app-window">
<div class="title-bar">
<h1>Мое приложение для Windows</h1>
<div class="buttons">
<button title="Свернуть"></button>
<button title="Развернуть"></button>
<button title="Закрыть" style="background: #e81123;"></button>
</div>
</div>
<div class="content">
<div class="sidebar">
<ул>
<li onclick="showContent('Home')">Home</li>
<li onclick="showContent('Settings')">Настройки</li>
<li onclick="showContent('О программе')">О программе</li>
</ul>
</div>
<div class="main-content" id="mainContent">
<p>Выберите элемент на боковой панели, чтобы просмотреть содержимое.</p>
</div>
</div>
</div>
<скрипт>
функция showContent(раздел) {
константное содержимое = {
Домашняя страница: '<h2>Главная</h2><p>Добро пожаловать на домашнюю страницу.</p>',
Настройки: '<h2>Настройки</h2><p>Настройте здесь настройки приложения.</p>',
О программе: '<h2>О программе</h2><p>Это макет приложения для Windows, созданный с использованием HTML и JavaScript.</p>',
};
document.getElementById('mainContent').innerHTML = content[раздел] || '<p>Содержимое не найдено.</p>';
}
</скрипт>
</тело>
</html>
index.html。Select an item from the sidebar to view content.
React — популярная библиотека JavaScript, разработанная Facebook для создания динамичных и эффективных пользовательских интерфейсов. Его компонентный дизайн позволяет разработчикам быстро создавать и повторно использовать компоненты пользовательского интерфейса.
Vue.js — это легкая и простая в использовании среда, подходящая для разработки приложений малого и среднего размера. Простой API и интуитивно понятный дизайн позволяют быстро разрабатывать пользовательские интерфейсы.
Bootstrap — это интерфейсная платформа, которая предоставляет множество готовых компонентов пользовательского интерфейса и инструментов макетирования для быстрого создания адаптивных веб-сайтов.
Material-UI — это платформа пользовательского интерфейса React, основанная на Google Material Design. Он содержит множество красивых компонентов и подходит для быстрого проектирования качественных интерфейсов.
Tailwind — это практичная платформа CSS, которая позволяет быстро создавать индивидуальный пользовательский интерфейс при использовании в сочетании с JavaScript. Его атомарный дизайн дает разработчикам гибкий контроль над стилями.
Foundation — это адаптивная интерфейсная среда, предоставляющая множество компонентов пользовательского интерфейса и сеточных систем, подходящих для быстрого создания современных веб-дизайнов.
Chakra UI — это простая и настраиваемая среда пользовательского интерфейса React, предоставляющая интуитивно понятный API и разнообразные компоненты.
Quasar — это инфраструктура пользовательского интерфейса, основанная на Vue.js, которая позволяет быстро создавать адаптивные и кроссплатформенные приложения.
React — это декларативная библиотека JavaScript, разработанная Meta и предназначенная для создания пользовательских интерфейсов. Это значительно повышает эффективность разработки и удобство обслуживания приложений, управляемых базами данных, за счет разработки компонентов и технологии виртуального DOM.
При разработке приложений на основе баз данных React часто комбинируется с современной цепочкой инструментов для обработки потока данных:
Хотя для разработки React можно использовать любой текстовый редактор, для взаимодействия с подсказками полей базы данных и проверкой типов наиболее распространенными в отрасли являются следующие варианты:
Чтобы оптимизировать процесс разработки React и приложений баз данных, в IDE рекомендуется установить следующие инструменты:
| Тип инструмента | Популярный выбор | основная ценность |
|---|---|---|
| Редактор кода (IDE) | VS Code, WebStorm | Эффективное написание кода и подсказки по типу |
| Инструменты управления пакетами | npm, pnpm, yarn | Управление React и зависимостями его экосистемы |
| Инструменты сборки | Vite, Turbopack | Чрезвычайно быстрое горячее обновление и производительность упаковки проектов. |
| отладчик | React DevTools | Мониторинг состояния компонентов и узких мест производительности в режиме реального времени |
импортировать React, {useState, useEffect} из «реагировать»;
функция DatabaseView() {
//Имитированные данные базы данных
const [данные, setData] = useState([]);
const [searchTerm, setSearchTerm] = useState('');
// Имитируем получение данных из базы данных
useEffect(() => {
const fetchData = асинхронный () => {
константные макетные данные = [
{ id: 1, имя: «Джон Доу», адрес электронной почты: «[email protected]», возраст: 28 },
{ id: 2, имя: «Джейн Смит», адрес электронной почты: «[email protected]», возраст: 34 },
{ id: 3, имя: «Элис Браун», адрес электронной почты: «[email protected]», возраст: 25 },
{ id: 4, имя: «Боб Уайт», адрес электронной почты: «[email protected]», возраст: 40 },
];
setData (mockData);
};
выборка данных();
}, []);
//Фильтрация данных
const filteredData = data.filter(
(предмет) =>
item.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
item.email.toLowerCase().includes(searchTerm.toLowerCase())
);
возврат (
<div style={{ padding: '20px', fontFamily: 'Arial, sans-serif' }}>
<h1>Просмотр базы данных</h1>
<вход
тип="текст"
Placeholder="Поиск по имени или адресу электронной почты"
значение = {searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
стиль={{
маржаBottom: '20px',
отступ: '10px',
ширина: '300 пикселей',
Размер шрифта: '16px',
}}
/>
<таблица
стиль={{
ширина: '100%',
borderCollapse: 'свернуть',
маржаTop: '10px',
}}
>
<голова>
<tr>
<th style={{ border: '1px Solid #ddd', Padding: '10px' }}>ID</th>
<th style={{ border: '1px Solid #ddd', Padding: '10px' }}>Name</th>
<th style={{ border: '1px Solid #ddd', Padding: '10px' }}>Email</th>
<th style={{ border: '1px Solid #ddd', Padding: '10px' }}>Age</th>
</tr>
</голова>
<тело>
{filteredData.map((item) => (
<tr key={item.id}>
<td style={{ border: '1px Solid #ddd', Padding: '10px' }}>
{item.id}
</тд>
<td style={{ border: '1px Solid #ddd', Padding: '10px' }}>
{item.name}
</тд>
<td style={{ border: '1px Solid #ddd', Padding: '10px' }}>
{item.email}
</тд>
<td style={{ border: '1px Solid #ddd', Padding: '10px' }}>
{item.age}
</тд>
</tr>
))}
</tbody>
</таблица>
</div>
);
}
экспортировать представление базы данных по умолчанию;
create-react-app。DatabaseView.js。App.jsИмпортируйте и используйте<DatabaseView />。React и PHP смешивают код не напрямую, а черезJSONформатировать данные для связи. React используетfetchилиaxiosОтправьте запрос, и PHP вернет результат после обработки.
Серверный PHP-код больше не выводит HTML, а вместо этого выводит заголовки и данные JSON.
<?php
// Разрешить запросы между источниками (CORS)
header("Access-Control-Allow-Origin: *");
header("Тип контента: application/json; charset=UTF-8");
// Имитируем получение данных из базы данных
$stocks = ["AAPL", "TSLA", "NVDA", "GOOGL", "MSFT"];
эхо json_encode ($ акции);
?>
В React мы обычно делаемuseEffectВызовите PHP API в хуке.
import { useEffect, useState } from 'react';
function StockList() {
const [data, setData] = useState([]);
useEffect(() => {
fetch("https://your-server.com/api.php")
.then(res => res.json())
.then(json => setData(json));
}, []);
return (
<ul>
{data.map(item => <li key={item}>{item}</li>)}
</ul>
);
}
| тип | Рекомендуемый план | иллюстрировать |
|---|---|---|
| Традиционный PHP | Собственный PHP или CodeIgniter | Подходит для простого интерфейса API. |
| современная рамка | Laravel | Самый мощный PHP-фреймворк с полной встроенной поддержкой API. |
| Гибридное решение | Inertia.js | Laravel можно легко интегрировать с React без написания API. |
В среде разработки, поскольку React обычно работает наlocalhost:5173, в то время как PHP работает наlocalhost:8000, вы столкнетесьCORS (совместное использование ресурсов между источниками)ошибка. Обязательно включите в начало PHPAccess-Control-Allow-Originзаголовок.
Vue.js — это прогрессивная среда JavaScript для создания пользовательских интерфейсов. В отличие от других крупных фреймворков, Vue предназначен для применения слой за слоем снизу вверх. Основная библиотека фокусируется только на уровне представления, что упрощает начало работы и интеграцию с существующими проектами.
Vue объединяет шаблоны HTML и объекты JavaScript, что позволяет разработчикам интуитивно управлять веб-контентом. В настоящее время основной рекомендацией является использование Vue 3.Composition API。
<!-- Шаблон Vue -->
<div id="app">
<h1>{{ message }}</h1>
<button @click="reverseMessage">Перевернуть текст</button>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<скрипт>
const {createApp, ref} = Vue;
создатьПриложение({
настройка() {
const message = ref("Привет, Vue!");
constverseMessage = () => {
message.value = message.value.split('').reverse().join('');
};
возврат {сообщение, обратное сообщение};
}
}).mount('#app');
</скрипт>
Инструкция есть сv-Специальный атрибут префикса отвечает за привязку данных к поведению DOM.
| инструкция | использовать | пример |
|---|---|---|
| v-bind (:) | Привязка атрибутов HTML | :src="imageUrl" |
| v-on (@) | Слушайте события | @click="doSomething" |
| v-if / v-else | Условный рендеринг | v-if="isVisible" |
| v-for | Отображение списка (аналогично использованию массива) | v-for="item in items" |
| v-model | Двусторонняя привязка данных | v-model="inputText" |
Вы можете легко интегрировать ранее упомянутоеslice()Или случайным образом выбирайте логику и манипулируйте компонентами с помощью концепции селектора.
<настройка сценария>
импортировать {ref} из 'vue';
const allStocks = ref(['AAPL', 'TSLA', 'GOOGL', 'MSFT', 'AMZN', 'NVDA', 'META']);
const selectedStocks = ref([]);
// В сочетании с логикой случайного выбора
const PickFive = () => {
const shuffled = [...allStocks.value].sort(() => 0.5 - Math.random());
selectedStocks.value = shuffled.slice(0, 5);
};
</скрипт>
<шаблон>
<див>
<button @click="pickFive"> Случайным образом выберите 5 акций</button>
<ул>
<li v-for="акции в выбранных акциях" :key="stock">{{ акции }}</li>
</ul>
</div>
</шаблон>
Веб-API (интерфейс программирования веб-приложений) — это интерфейс на основе протокола HTTP, который позволяет обмениваться данными между различными системами и часто используется для связи между интерфейсом и сервером.
| метод | использовать |
|---|---|
| GET | Получить информацию |
| POST | Добавить новую информацию |
| PUT | Обновить информацию |
| DELETE | Удалить данные |
Вот пример использования JavaScript для отправки запроса GET:
выборка('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Ошибка:', ошибка));
Введите китайский иероглиф, и система отобразит фонетическое обозначение иероглифа:
Еще не запрошено
В этом примере используется API Пиньинь для запроса Чжуинь. Если существует несколько вариантов произношения, будут отображены все результаты.
Google Cloud Platform (GCP) — это платформа облачных вычислений, предоставляемая Google и построенная на внутренней инфраструктуре Google. Он предоставляет более 150 услуг, от вычислений и хранения до анализа больших данных и искусственного интеллекта, чтобы помочь предприятиям в цифровой трансформации и разработке приложений.
| категория | Ключевые услуги | Основные функции |
|---|---|---|
| Вычислить | Compute Engine | Предоставляет настраиваемые виртуальные машины (ВМ). |
| Контейнеры | GKE / Cloud Run | Размещайте кластеры Kubernetes или выполняйте бессерверные контейнеры. |
| Хранилище | Cloud Storage | Объектное хранилище, в котором хранятся неструктурированные данные, такие как изображения и видео. |
| База данных | Cloud SQL / Spanner | Предоставляет MySQL, PostgreSQL или глобальную реляционную базу данных. |
| Анализ данных (Данные) | BigQuery | Бессерверное хранилище данных корпоративного уровня, поддерживающее крупномасштабные запросы SQL. |
| Искусственный интеллект (ИИ) | Vertex AI | Интегрированная платформа машинного обучения, включая инструменты разработки моделей Gemini. |
Организация ресурсов Google Cloud соответствует иерархической системе, облегчающей контроль разрешений и отслеживание затрат:
Google Cloud использует механизм оплаты по мере использования и предоставляет следующие преимущества:
Вход в Google ID — это метод аутентификации, основанный на протоколе OAuth 2.0, который позволяет пользователям входить на сторонние веб-сайты или приложения, используя свои учетные записи Google. Такой подход не только повышает удобство пользователя, но и повышает безопасность, поскольку пользователям не нужно запоминать дополнительные пароли.
<script src="https://apis.google.com/js/platform.js" async defer></script>
<div class="g_id_signin" data-type="standard" data-shape="rectangular" data-theme="outline" data-text="signin_with" data-size="large" data-logo_alignment="left"></div>
Когда пользователь нажимает кнопку входа в систему, Google выполняет аутентификацию. После успешного входа в систему информация пользователя (например, адрес электронной почты, имя и т. д.) будет отправлена обратно в ваше приложение, и вы сможете выполнить последующую обработку на основе этой информации.
Вход с помощью идентификатора Google предоставляет пользователям простой и безопасный способ входа и упрощает управление несколькими учетными записями. Интегрируя систему входа в систему Google, разработчики могут улучшить взаимодействие с пользователем и привлечь больше пользователей на свой веб-сайт или в приложение.
Если вы хотите встроить видео YouTube, измените исходную ссылку для встраивания формата:
<iframe width="560" height="315" src="https://www.youtube.com/embed/{vid}" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
в{vid}— идентификатор видео YouTube.
Например, ссылка на видеоhttps://www.youtube.com/watch?v=dQw4w9WgXcQ, то код для встраивания будет следующим:
<iframe width="560" height="315" src="https://www.youtube.com/embed/dQw4w9WgXcQ" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
Такой формат встраивания позволяет избежатьX-Frame-OptionsОграничьте, чтобы видео нормально отображалось на странице.
Может использоваться непосредственно в HTML.<iframe>Вставлять видео с YouTube,
Но YouTube этого не делаетПрямое встраивание iframe в «страницу результатов поиска» не поддерживается.,
Поскольку результаты поиска представляют собой интерактивный контент (включая функции входа в систему, рекомендации, отслеживания и т. д.), они будут заблокированы политикой YouTube встраивания.
Следующие попытки встроить результаты поиска завершатся неудачно или отобразят сообщение об ошибке:
<!-- ⚠️ Невозможно правильно отобразить -->
<iframe ширина="800" высота="600"
src="https://www.youtube.com/results?search_query=cat+video">
</iframe>
Этот метод будет заблокирован браузером или YouTube и отобразит сообщение «Отклонено для отображения в iframe».
---Чтобы встроить эффект результатов поиска в веб-страницу, используйтеYouTube Data API v3Динамически запрашивайте видео, затем используйте JavaScript, чтобы самостоятельно отображать результаты и создавать<iframe>。
Перейти кGoogle Cloud ConsoleВключите «YouTube Data API v3» и получите ключ API.
<див>
<input id="search" type="text" Placeholder="Ключевые слова для поиска">
<button onclick="searchYouTube()">Поиск</button>
</div>
<div id="results" style="display:grid;grid-template-columns:repeat(auto-fill,300px);gap:1em;margin-top:1em;"></div>
<скрипт>
const API_KEY = "ВАШ_API_KEY";
функция поискаYouTube() {
const q = document.getElementById("search").value;
const url = `https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&maxResults=6&q=${encodeURIComponent(q)}&key=${API_KEY}`;
получить (URL-адрес)
.then(r => r.json())
.then(данные => {
const контейнер = document.getElementById("результаты");
контейнер.innerHTML = "";
data.items.forEach(item => {
const vid = item.id.videoId;
const title = item.snippet.title;
constframe = document.createElement("iframe");
рамка.ширина = "300";
кадр.высота = "170";
Frame.src = `https://www.youtube.com/embed/${vid}`;
Frame.allow = "акселерометр; автовоспроизведение; запись в буфер обмена; зашифрованный носитель; гироскоп; картинка в картинке";
Frame.allowFullscreen = правда;
const div = document.createElement("div");
const caption = document.createElement("p");
caption.textContent = заголовок;
caption.style.fontSize = "14px";
caption.style.fontWeight = "жирный";
div.appendChild(кадр);
div.appendChild(заголовок);
контейнер.appendChild(div);
});
});
}
</скрипт>
---
<iframe>встроенный, можно воспроизводить напрямую.iframe.src = "https://www.youtube.com/embed/" + videoId + "?autoplay=1"Играть автоматически.snippet.thumbnailsПоказывать миниатюру вместо немедленного встраивания.Node.js — это среда выполнения на стороне сервера, основанная на движке JavaScript Chrome V8, которая позволяет разработчикам писать серверные приложения с использованием JavaScript.
express:Легкая платформа веб-приложенийfs: Операции с файловой системойhttp:Создать HTTP-серверpath: Путь к файлу процессаconst http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Привет, Node.js!');
});
server.listen(3000, () => {
console.log('Сервер запущен, прослушивает порт 3000');
});
Node.js предоставляет унифицированную языковую среду разработки для интерфейсных разработчиков, повышает эффективность разработки и подходит для создания современных сетевых приложений.
Существует множество способов установки Node.js, но разработчикам настоятельно рекомендуется использовать инструменты управления версиями (например, nvm) вместо прямой загрузки официального установочного файла с веб-сайта. Это предотвратит будущие ошибки разрешений и облегчит переключение между версиями.
Это наиболее гибкий подход, подходящий для компьютерных сред, требующих долгосрочной разработки.
nvm-setup.exeи установить.nvm install lts //Установить последнюю версию с долгосрочной поддержкой (LTS) nvm use lts // Переключение и включение этой версии node -v // Подтверждаем успешность установки
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
nvm install --lts //Установить LTS-версию node -v // Просмотр номера версии
Если вам нужна только быстрая установка и вы не планируете часто менять версии, вы можете перейти кОфициальный сайт Node.js。
Установка Node.js также будет включать следующие основные компоненты:
| Имя компонента | иллюстрировать |
|---|---|
| Среда выполнения Node.js | Ядро, позволяющее запускать JavaScript на стороне сервера. |
| npm (Node Package Manager) | Крупнейший в мире реестр программного обеспечения для загрузки пакетов (таких как Vue, React). |
| Corepack | Новые инструменты для управления менеджерами пакетов (например, Yarn, pnpm). |
После завершения установки вы можете ввести следующую команду, чтобы подтвердить, что все инструменты готовы:
node -v // Отображение версии узла, например v20.11.0 npm -v // Отображение версии npm, например 10.2.4
Если при выполнении в Windows вы получаете сообщение об ошибке «Поскольку выполнение сценария запрещено в вашей системе», откройте PowerShell от имени администратора и выполните:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
nvm (Node Version Manager) — это инструмент управления версиями, разработанный специально для Node.js. Он позволяет устанавливать и переключать несколько разных версий Node.js на одном компьютере, что является важным инструментом для разработчиков, которым необходимо одновременно поддерживать несколько проектов, использующих разные версии Node.
При разработке интерфейсных проектов (таких как Vue, React) разные проекты могут зависеть от конкретных версий Node.js. Загрузив установочный файл напрямую с официального сайта, можно установить только одну версию, но nvm решает проблему конфликтов версий.
Ниже приведены инструкции nvm, часто используемые во время разработки:
// Просмотр всех установленных на данный момент версий НВМЛ // Просматриваем все версии Node.js, доступные для установки в облаке NVM ls-удаленный // Установите конкретную версию (например, v18.16.0) установка НВМ 18.16.0 //Переходим на указанную версию НВМ использует 18.16.0 // Проверяем версию, которая используется в данный момент НВМток //Устанавливаем версию по умолчанию (версию, которая автоматически используется при каждом включении терминала) псевдоним nvm по умолчанию 18.16.0
когда вы выполняетеnvm usenvm будет динамически изменять вашу системуPATHПеременные среды переключают адрес, указывающий на исполняемый файл Node, в папку соответствующей версии, тем самым достигается безболезненное переключение.
| Операционная система | Рекомендуемые версии/инструменты | Примечание |
|---|---|---|
| macOS / Linux | nvm (nvm-sh) | Самая оригинальная и стабильная версия. |
| Windows | nvm-windows | Он разработан разной командой, но функции у него практически одинаковые. Для установки вам необходимо скачать .exe. |
Установить в Windowsnvm-windowsРанее настоятельно рекомендуется удалить Node.js, который был изначально установлен на вашем компьютере, чтобы избежать конфликтов переменных среды, которые могут привести к сбою переключения.
NPM (Node Package Manager) — это инструмент управления пакетами для Node.js, используемый для управления библиотеками и модулями кода JavaScript. Он позволяет разработчикам устанавливать, совместно использовать и контролировать версии различных пакетов, необходимых для их проектов.
npm init: Инициализируйте новый проект и создайтеpackage.jsonфайл.npm install:Установитьpackage.jsonВсе зависимые пакеты, перечисленные в .npm install [имя пакета]: установить указанный пакет.npm удалить [имя пакета]: удалить указанный пакет.npm update: обновить установленные пакеты.package.jsonЭто основной файл проекта, в котором записано имя проекта, версия, описание, зависимые пакеты и другая информация. Это основа пакета управления NPM.
NPM — самый ранний и наиболее широко используемый инструмент управления пакетами JavaScript, но появились более поздние альтернативы, такие как Yarn, обеспечивающие более высокую скорость установки и параллельную обработку. Оба могут использоваться в большинстве проектов Node.js.
Vite (по-французски «быстрый») — это новое поколение инструментов разработки интерфейса, предназначенное для обеспечения чрезвычайно быстрой разработки. В основном он состоит из двух частей: сервера разработки (на основе собственных ES-модулей) и набора инструкций по сборке (упакованного с помощью Rollup).
До появления Vite основным инструментом был Webpack, но по мере того, как проект рос, скорость компиляции становилась очень медленной. Vite решает эту проблему:
Вы можете быстро создать проект Vue, React, Svelte или чистый JavaScript с помощью одной строки команды.
// Используйте npm для создания проекта npm create vite@latest my-vue-app //Переходим в папку и устанавливаем пакет cd мое-vue-приложение установка npm //Запускаем среду разработки НПМ Rundev
в проектеpackage.json, вы увидите следующие часто используемые скрипты:
| инструкция | использовать | иллюстрировать |
|---|---|---|
| npm run dev | Запустить сервер разработки | Используется во время локальной разработки и поддерживает обновления в реальном времени. |
| npm run build | Упаковка проекта | Создавайте высокооптимизированные статические файлы (помещайте их в папку dist). |
| npm run preview | Предварительный просмотр результатов упаковки | Смоделируйте рабочее состояние после локального развертывания. |
Конфигурация Vite очень интуитивно понятна и обычно используется для добавления плагинов (плагинов) или настройки прокси-сервера (прокси).
импортировать { defineConfig } из 'vite'
импортировать vue из @vue/plugin-vue
экспортировать default defineConfig({
плагины: [vue()],
сервер: {
порт: 3000, // Изменяем номер порта сервера разработки
open: true // Автоматически открывать браузер при запуске
}
})
Webpack:Подобно полнофункциональному «крупномасштабному обрабатывающему заводу», все детали должны быть обработаны перед началом работы. Он медленнее, но чрезвычайно функционален.
Vite:Как и «Modern Express», он динамически загружает все необходимые вам части, очень быстро и в соответствии с современными стандартами браузера.
Electron — это платформа с открытым исходным кодом, которая позволяет разработчикам создавать кроссплатформенные настольные приложения с использованием HTML, CSS и JavaScript. Он сочетает в себе Chromium и Node.js, чтобы предоставить веб-технологиям доступ к собственным системным ресурсам.
npm install --save-dev electron
// main.js
const { app, BrowserWindow } = require('electron');
function createWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
});
win.loadFile('index.html');
}
app.whenReady().then(createWindow);
<!DOCTYPE html>
<html>
<тело>
<h1>Привет, Электрон! </h1>
</тело>
</html>
npx electron .
electron-builderМожет использоваться для создания установочных файлов.TypeScript — это расширенная версия JavaScript, разработанная Microsoft. Он добавляет «систему типов» в JavaScript и в конечном итоге будет скомпилирован в чистый JavaScript для выполнения в браузере. Это решает проблему, заключающуюся в том, что JavaScript, как слабо типизированный язык, сложно поддерживать и он подвержен ошибкам в больших проектах.
Добавив после переменной: typeобъявить тип.
let name: string = "Близнецы";
пусть возраст: число = 18;
пусть isStudent: boolean = true;
//тип массива
let stocks: string[] = ["AAPL", "TSLA", "NVDA"];
// Параметры функции и типы возвращаемых значений
функция add(a: число, b: число): число {
вернуть а + б;
}
Это одна из самых мощных функций TypeScript, используемая для определения структуры (формы) объектов.
Пользователь интерфейса {
идентификатор: номер;
имя пользователя: строка;
электронная почта?: строка; // Знак вопроса указывает на необязательный атрибут
}
const newUser: Пользователь = {
идентификатор: 1,
имя пользователя: «Алекс»
};
Современные среды разработки, такие как Vite, по умолчанию поддерживают TypeScript. Выберите при создании проектаvue-tsилиreact-ts, Vite автоматически обработаетtsconfig.jsonконфигурация.
// Используйте Vite для создания проекта TS npm create vite@latest my-ts-app -- --template vue-ts
Переписывание ранее упомянутой функции случайного выбора в версию TypeScript сделает ее более безопасной:
// Общий <T> позволяет этой функции обрабатывать массивы любого типа
function getRandomElements<T>(arr: T[], count: Number = 5): T[] {
если (объем. длина<= count) return [...arr];
const tempArray = [...arr];
const result: T[] = [];
for (let i = 0; i < count; i++) {
const randomIndex = Math.floor(Math.random() * tempArray.length);
result.push(tempArray.splice(randomIndex, 1)[0]);
}
return result;
}
const randomStocks = getRandomElements<string>(["AAPL", "TSLA", "GOOGL"], 2);
Файлы TypeScript (.ts) не могут быть выполнены непосредственно в браузере, и их жизненный цикл выглядит следующим образом:
| этап | действие | инструмент |
|---|---|---|
| период написания | Определите типы и напишите код .ts | VS Code + TS Engine |
| время компиляции | Проверьте наличие ошибок типа и удалите теги типа. | tsc / Vite / esbuild |
| Срок исполнения | Запускайте чистые файлы .js в браузере | Browser Engine |
Расширение браузера — это небольшое приложение, используемое для расширения функций браузера, обычно написанное на HTML, CSS и JavaScript. Он может изменять содержимое веб-страницы, добавлять кнопки на панель инструментов, взаимодействовать с фоновыми службами и улучшать взаимодействие с пользователем.
manifest.json: Опишите имя расширенной функции, версию, разрешения и вход.popup.html: интерфейс, отображаемый после щелчка по значку на панели инструментов.background.js: фоновый резидентный скрипт, используемый для обработки событий и логики.content.js: Скрипты, внедренные в веб-страницы, могут напрямую манипулировать DOM.chrome://extensions/нагрузка.manifest.jsonи связанные файлы.my-extension/
├─ manifest.json
├─ popup.html
├─ popup.js
└─ icon.png
{
«manifest_version»: 3,
"name": "Привет, расширение",
"версия": "1.0",
"description": "Пример простого расширения Chrome",
"действие": {
"default_popup": "popup.html",
"default_icon": {
"16": "icon.png",
"48": "icon.png",
"128": "icon.png"
}
},
"разрешения": []
}
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
<style>
body { width:200px; font-family:sans-serif; text-align:center; }
button { margin-top:10px; padding:5px 10px; }
</style>
</head>
<body>
<h3>Hello from Chrome Extension</h3>
<button id="btn">Click me</button>
<script src="popup.js"></script>
</body>
</html>
document.getElementById("btn").addEventListener("click", () => {
alert("Кнопка нажата!");
});
Поместите значок PNG (рекомендуемый размер 128x128) на панель инструментов.
chrome://extensions/Расширения Chrome созданы на основе стандартных веб-технологий, поэтому их основной язык полностью соответствует веб-разработке, которая является важной основой.
Для создания более сложных и реактивных пользовательских интерфейсов (особенно всплывающих окон и страниц параметров) можно использовать общие интерфейсные платформы. Однако обратите внимание, что обычно не рекомендуется использовать тяжеловесные платформы в фоновых службах, которые расширяют функциональность.
Чтобы упростить процесс разработки, обеспечить упаковку кода, горячую перезагрузку (Hot Reloading) и кроссбраузерную совместимость, тенденцией является использование современных инструментов разработки.
| Инструменты/Наборы | использовать | Преимущества |
|---|---|---|
| Vite / Webpack | Бандлер | Упакуйте несколько файлов кода, стилей и ресурсов в формат, читаемый браузером, чтобы оптимизировать размер кода. Vite очень популярен благодаря быстрой замене модулей в горячем режиме (HMR). |
| WXT / Plasmo | Специальная платформа с расширенными функциями | Платформа, специально разработанная для разработки расширений, может автоматически генерировать файлы манифеста, настраивать TypeScript, горячую перезагрузку и поддерживать кроссбраузерность (Chrome, Firefox, Edge и т. д.), что значительно упрощает процесс разработки. |
| pnpm / npm / yarn | Инструменты управления пакетами | Управляйте сторонними библиотеками и инструментами JavaScript, от которых зависит ваш проект. |
Это важный инструмент для разработки всех расширений Chrome.
php.iniЭто основной файл конфигурации PHP, который влияет на режим выполнения и функции PHP.
Изменяя этот файл, вы можете настроить вывод ошибок, ограничения памяти, размер загрузки, часовой пояс и многое другое.C:\php\php.iniИли в каталоге установки./etc/php/номер версии/apache2/php.iniили/etc/php/version/cli/php.ini。php --iniЗапросите файл конфигурации, используемый CLI.-cЕсли параметр указан, путь будет загружен первым.php.ini。PHPRCуказанный каталог.php --iniилиphpinfo()запрос)./etc/php.iniилиC:\Windows。; Установить часовой пояс
date.timezone = Азия/Тайбэй
; показать ошибку
display_errors = Вкл.
error_reporting = E_ALL
; Размер файла загрузки
upload_max_filesize = 20M
post_max_size = 25M
; Ограничение памяти
предел_памяти = 256 МБ
; Максимальное время выполнения (секунды)
max_execution_time = 30
php.iniПосле этого вам необходимо перезапустить Apache, Nginx или PHP-FPM, чтобы изменения вступили в силу.phpinfo()Проверьте загруженный в данный моментphp.iniЗначения пути и параметров.php.ini。.user.iniили.htaccessПерезапишите некоторые настройки.Логическое значение — это самый простой тип данных в PHP. Он может представлять только два состояния: **истина** или **ложь**. Логические значения часто используются для процессов управления (например.if/elseУсловное суждение) и логические операции.
Вы можете использовать ключевые словаtrueилиfalseопределить логическую переменную. Эти ключевые слова не чувствительны к регистру (например,TRUE、Trueилиtrueодинаковы), но обычно рекомендуется использовать строчные буквы.trueиfalseдля соблюдения стандартной практики.
$is_active = правда;
$is_logged_out = ЛОЖЬ; // Хотя можно использовать прописные буквы, использовать их не рекомендуется.
//Условное суждение
если ($is_active) {
echo "<p>Пользователь в данный момент активен.</p>";
} еще {
echo "<p>Пользователь в настоящее время неактивен.</p>";
}
Когда PHP ожидает логическое значение, но получает другой тип данных (например, вifусловие), PHP автоматически преобразует (или приводит тип) значение к логическому значению.
Следующие значения считаются ложными (называемыми ложными значениями):
falseсам.0(ноль).0.0(ноль).""или''。"0"(строка, содержащая однозначный ноль).array()или[]。NULL。Все остальные значения, включая любое ненулевое число, любую непустую строку (даже"false"или" "[включая пробелы]), будет рассматриваться как **true (истина)** (называемое значением Truthy).
$а = 0;
$b = "Привет";
$с = "";
$д = [1, 2];
$ е = ноль;
echo "<h3>Пример ложного значения</h3>";
if (!$a) { // $a (0) преобразуется в false
echo "<p>$a (целое число 0) рассматривается как FALSE.</p>";
}
if (!$c) { // $c (пустая строка) преобразуется в false
echo "<p>$c (пустая строка) рассматривается как FALSE.</p>";
}
if (!$e) { // $e (NULL) преобразуется в false
echo "<p>NULL рассматривается как FALSE.</p>";
}
echo "<h3>Пример истинного значения</h3>";
if ($b) { // $b ("Привет") преобразуется в true
echo "<p>$b (непустая строка) рассматривается как TRUE.</p>";
}
if ($d) { // $d (непустой массив) преобразуется в true
echo "<p>Непустые массивы рассматриваются как TRUE.</p>";
}
Вы также можете использовать(bool)илиboolval()Функция явно преобразует переменную в логическое значение, что полезно при отладке или когда требуется строгая проверка типов.
$ф = "0"; // строка с нулевым номером $г = 100; // положительное целое число $f_bool = (логическое значение)$f; $g_bool = boolval($g); echo "<p>Строка '0' преобразуется в: "; var_dump($f_bool); // Вывод: bool(false) эхо "</p>"; echo "<p>Целое число 100 преобразуется в: "; var_dump($g_bool); // Вывод: bool(true) эхо "</p>";
В PHP операторы сравнения используются для сравнения двух значений (числ или строк). По результату сравнения будет возвращеноtrueилиfalse. Понимание разницы между «свободным сравнением» и «строгим сравнением» является ключом к предотвращению ошибок в программе.
| оператор | имя | пример | Условия, которые приводят к истинному |
|---|---|---|---|
== |
равный (свободный) | $a == $b |
Значения равны (сравнение типов будет автоматически преобразовано) |
=== |
Конгруэнтный (строгий) | $a === $b |
Значения равны и типы тоже одинаковы |
!= / <> |
не равен | $a != $b |
Ценности не равны |
!== |
Не конгруэнтно | $a !== $b |
Значения не равны или типы не совпадают |
> |
больше, чем | $a > $b |
$a больше, чем $b |
< |
меньше, чем | $a < $b |
$a меньше $b |
>= |
Больше или равно | $a >= $b |
$a больше или равна $b |
<= |
меньше или равно | $a <= $b |
$a меньше или равна $b |
<=> |
оператор космического корабля | $a <=> $b |
Возвращает -1, 0 или 1 (PHP 7+) |
Это наиболее распространенная область путаницы в разработке PHP. PHP — слабо типизированный язык.==Попытается преобразовать переменные разных типов в один и тот же тип, прежде чем сравнивать их, и===Никакое преобразование не производится вообще.
Это верно, пока «значения» после преобразования равны:
$а = 100; // целое число (целое)
$б = "100"; // строка (строка)
если ($а == $b) {
эхо «Равно»; // Это будет выполнено, поскольку PHP преобразует строки в числовые сравнения
}
«Значение» должно быть точно таким же, как «тип данных»:
$а = 100;
$б = "100";
если ($а === $b) {
эхо «Равно»;
} еще {
эхо «не равно»; // это будет выполнено, поскольку int не равно строке
}
Сокращенный синтаксис делает ваш код чище при работе с логикой сравнения:
$result = ($a > $b) ? «Большой»: «Большой»;$name = $input_name ?? «Посетитель»;(Предоставляет значение по умолчанию, если переменная не существует или имеет значение NULL).Совет по безопасности:При выполнении аутентификации, проверке разрешений или оценке возвращаемого значения API обязательно используйте===. Например, проверьтеstrpos()Возвращаемое значение0(должность) иfalse(не найден) в==будут считаться одинаковыми, что приведет к логическим ошибкам.
В PHP массив — это очень полезный составной тип данных, который может хранить несколько значений в одной переменной. Массив PHP на самом деле представляет собой упорядоченную карту. Карта — это тип, который связывает Значения с Ключами.
Массивы PHP можно условно разделить на три общие формы в зависимости от типа их ключей:
Используйте последовательные целые числа в качестве ключей. Если вы не укажете ключ при построении массива, PHP начнет с0Начните автоматически назначать целочисленные индексы.
//Создаем индексированный массив
$fruits = array("яблоко", "банан", "апельсин");
// Или используйте сокращенный синтаксис (после PHP 5.4)
$colors = ["красный", "зеленый", "синий"];
//Доступ к элементам
эхо $fruits[0]; // Вывод: яблоки
эхо $colors[2]; // Вывод: синий
Используйте строки в качестве ключей (имен ключей). Это позволяет использовать осмысленные имена для доступа к значениям в массиве.
//Создаем ассоциативный массив
$человек = массив(
"имя" => "Сяо Мин",
«возраст» => 25,
"город" => "Тайбэй"
);
// Или используйте сокращенный синтаксис
$баллы = [
«Математика» => 90,
«Английский» => 85
];
//Доступ к элементам
эхо $person["имя"]; // Вывод: Сяо Мин
echo $scores["Английский"]; // Вывод: 85
Значения в массиве, в свою очередь, являются другим массивом. Обычно это используется для хранения табличных или иерархических данных.
$студенты = [
[
"имя" => "Алиса",
"баллы" => ["Математика" => 95, "Наука" => 88]
],
[
"имя" => "Боб",
"баллы" => ["Математика" => 78, "Наука" => 92]
]
];
//Доступ к элементам (доступ к результатам Боба по естествознанию)
echo $students[1]["баллы"]["Наука"]; // Вывод: 92
PHP предоставляет сотни встроенных функций для работы с массивами. Вот некоторые из наиболее часто используемых:
count($array): подсчитывает количество элементов в массиве.print_r($array): отображает структуру и значения массива в удобочитаемом формате (обычно используется для отладки).array_push($array, $value1, ...): Переместить (добавить) один или несколько элементов в конец массива.array_pop($array): Извлекает (удаляет и возвращает) последний элемент массива.array_keys($array): Возвращает новый массив, состоящий из всех имен ключей в массиве.array_values($array): Возвращает новый массив, состоящий из всех значений массива.in_array($needle, $haystack): проверить, существует ли определенное значение в массиве.array_key_exists($key, $array): проверить, существует ли в массиве определенный ключ.Обычно используетсяforeachПеребрать все элементы массива:
$staff = ["Менеджер" => "Чжан Сан", "Инженер" => "Ли Си", "Дизайнер" => "Ван Ву"];
// Обход ассоциативного массива (получение ключей и значений)
foreach ($staff as $title => $name) {
эхо $title. ": " . $имя. "<br>";
}
// Обход индексированного массива (только получение значений)
$items = ["А", "Б", "С"];
foreach ($items как $item) {
эхо $элемент. "<br>";
}
strcasecmp()Выполните сравнение строк без учета регистра.
Если возвращаемое значение равно 0, это означает, что две строки равны.<?php
$str1 = "Привет";
$str2 = "Привет";
if (strcasecmp($str1, $str2) === 0) {
echo "Строки равны (без учета регистра)";
} еще {
echo "Строки не равны";
}
?>
str_ireplace()。
<?php
$text = "Привет, мир";
$result = str_ireplace("привет", "Привет", $text);
эхо $результат; // Вывод «Привет, мир»
?>
iигнорировать регистр.<?php
if (preg_match("/hello/i", "HELLo PHP")) {
echo «Сравнение успешно»;
}
?>
При обработке строк пути к файлу в PHP рукописное разделение строк (например, использованиеexplode), поскольку разные операционные системы (Windows использует\, для Linux/) обрабатываются по-разному. PHP имеет несколько мощных встроенных функций для безопасного дизассемблирования путей.
Это моя наиболее рекомендуемая функция. Он может разобрать путь на: имя каталога, полное имя файла, расширение файла и имя файла без расширения.
$path = "/var/www/html/assets/img/logo.png"; $информация = информация о пути ($путь); echo $info['имя_каталога']; // /var/www/html/assets/img echo $info['basename']; // логотип.png echo $info['расширение']; // png echo $info['имя файла']; // логотип (поддерживается PHP 5.2+)
$path = "C:\projects\web\index.php"; базовое имя эха ($ путь); // индекс.php echo basename($path, ".php"); // индекс (удалить указанное расширение файла) эхо имя_каталога ($ путь); // C:\проекты\веб
Он разрешит все символы относительного пути (например,../или./) и возвращает истинный абсолютный путь в операционной системе. Если файл не существует, он будет возвращенfalse。
echo Realpath("../../config.php");
//Вывод аналогичен: /var/www/config.php
---
Чтобы гарантировать отсутствие ошибок при разработке Windows и развертывании Linux, рекомендуется единообразно преобразовывать обратную косую черту в прямую:
$path = "C:\User\Admin\Desktop\test.txt";
$safe_path = str_replace('\\', '/', $path);
// Результат: C:/User/Admin/Desktop/test.txt
Ручное сращивание$dir . '/' . $fileсклонен к появлению//Ошибка двойной косой черты. Можно использоватьDIRECTORY_SEPARATOR(системный разделитель) илиrtrim:
$dir = "/var/www/html/"; $file = "index.php"; //Универсальный метод сплайсинга $full_path = rtrim($dir, '/\\') . DIRECTORY_SYSTEM_SEPARATOR . $файл;
$allowed = ['jpg', 'png', 'gif'];
$ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
если (in_array($ext, $allowed)) {
echo "Правильный формат";
}
---
| функция | Пример ввода:/data/web/test.php |
Возврат результатов |
|---|---|---|
| pathinfo() | pathinfo($p) |
Возвращает ассоциативный массив (Array), содержащий всю информацию. |
| basename() | basename($p) |
test.php(Чистое имя файла) |
| dirname() | dirname($p) |
/data/web(Оглавление) |
| realpath() | realpath("./test.php") |
/absolute/path/to/test.php(реальный путь) |
Чтобы получить точное имя каталога верхнего уровня из строки пути (например,var), наиболее надежный метод — сначала преобразовать путьнормализация, а затем используйтеexplode()Разобрать строку. Поскольку путь обычно начинается с косой черты, первый элемент дизассемблированного массива часто оказывается пустым, что требует специальной обработки.
Это наиболее распространенный способ, черезltrim()Перед разделением удалите косую черту и убедитесь, что первая позиция в массиве соответствует нужному имени.
$path = "/var/www/html/assets/img/logo.png";
// 1. Сначала удалите крайнюю левую косую черту, чтобы избежать появления пустого первого элемента, созданного при взрыве
// 2. Разбиваем на массивы по слешам
$parts = взрыв('/', ltrim($path, '/'));
// 3. Получаем первый элемент массива
$rootDir = $parts[0];
эхо $rootDir; // Вывод: вар
Если ваш путь может исходить из Windows или Linux, рекомендуется сначала унифицировать формат косой черты и отфильтровать повторяющиеся косые черты.
$path = "/var/www/html/assets/img/logo.png";
// Равномерно преобразуем косую черту и отфильтровываем пустые элементы
$parts = array_values(array_filter(explode('/', $path)));
$rootDir = $parts[0] ?? '';
эхо $rootDir; // Вывод: вар
Если вы не хотите обрабатывать «конкретные строки», но хотите знать имя корневой папки веб-сервера, вы можете использовать$_SERVER:
// Предположим, что DOCUMENT_ROOT — это /var/www/html.
$rootParts = взрыв('/', ltrim($_SERVER['DOCUMENT_ROOT'], '/'));
эхо $rootParts[0]; // Вывод: вар
---
| Цель | Соответствующий код | Пример результатов |
|---|---|---|
| каталог верхнего уровня | explode('/', ltrim($path, '/'))[0] |
var |
| Предыдущий каталог | basename(dirname($path)) |
img |
| Полный путь к каталогу | dirname($path) |
/var/www/html/assets/img |
При работе с путями обязательно обратите внимание, есть ли косая черта в начале пути."/var"После разделения станет["", "var"],и"var"После разделения станет["var"]. использоватьltrim($path, '/')Это гарантирует, что результат будет согласованным независимо от того, есть ли в начале косая черта.
| Приоритет | иллюстрировать |
|---|---|
| 1. | Указанный абсолютный или относительный путь: напрямую укажите путь к файлу, и PHP сначала выполнит поиск файла по этому пути. |
| 2 | Текущий каталог исполняемого файла: если полный путь не указан, PHP сначала будет искать файл в каталоге, где находится исполняемый файл. |
| 3 | Параметр include_path: если файл не может быть найден в каталоге выполнения, PHP проверитphp.iniустановить вinclude_pathпуть. |
| 4 | Файл не существует. Если файл не найден ни по одному из указанных выше путей, будет сгенерировано предупреждение (Warning) и вернутьсяfalse。 |
может пройти через$_SERVER['PHP_SELF']Получите путь к файлу текущего выполнения, а затем используйтеbasenameПолучить имя файла:
<?php
$current_page = basename($_SERVER['PHP_SELF']);
echo "Имя текущей страницы:" . $ текущая_страница;
?>
через$_SERVER['REQUEST_URI']Получите полный путь URL-адреса, а затем используйтеparse_urlиbasenameИмя файла разбора:
<?php
$url_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$current_page = базовое имя ($url_path);
echo "Имя текущей страницы:" . $ текущая_страница;
?>
Если URL содержит параметры запроса, их можно обрабатывать отдельно:
<?php
$url_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$query_string = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
$current_page = базовое имя ($url_path);
echo "Имя файла:" . $ текущая_страница . "<br>";
echo "Параметры запроса:" .$query_string;
?>
Предположим, текущий URL-адресhttps://example.com/page.php?id=123:
Текущее имя страницы: page.php
Имя файла: page.php
Параметры запроса: id=123
В PHP, когдаmain.phpиспользоватьincludeпредставлятьsubpage.phpВ это время два файла фактически «объединяются и выполняются». Чтобы получить «основной путь программы» и «введенный путь к файлу» соответственно, вам необходимо использовать разные суперглобальные переменные и константы.
Независимо от того, кто импортировал файл, используйте магическую константу__FILE__Всегда указывает на путь к «файлу, в котором находится этот код».
//Запись в subpage.php $thisFilePath = __FILE__; echo "Текущий путь к файлу: " . $thisFilePath; //Вывод аналогичен: /var/www/html/fullpath/subpage.php
когда тыsubpage.phpЧтобы выяснить, кто был исходной точкой входа, есть несколько способов:
$_SERVER['SCRIPT_FILENAME'](самый точный)$mainPath = $_SERVER['SCRIPT_FILENAME'];
get_included_files()(расширенное отслеживание)0Это исходный файл записи.$allFiles = get_included_files(); $mainPath = $allFiles[0];
Пожалуйста, поместите следующий код в свойsubpage.phpСредний тест:
<?php
// 1. Путь к самому файлу, который вводится
$sub_page_path = str_replace('\\', '/', __FILE__);
// 2. Путь к основному исполняемому файлу
$main_page_path = str_replace('\\', '/', $_SERVER['SCRIPT_FILENAME']);
echo "Путь к подстранице: " . $sub_page_path. "<br>";
echo "Путь к главной странице: " . $main_page_path. "<br>";
?>
Советы: str_replace('\\', '/', ...)Он предназначен для унификации форматов путей Windows (обратная косая черта) и Linux (косая черта), что очень удобно при кроссплатформенной разработке.
---
Если вы имеете в виду не путь к жесткому диску сервера (полный путь), а URL-путь в браузере, вам следует использовать:
| Цель | грамматика | иллюстрировать |
|---|---|---|
| URL-путь | $_SERVER['REQUEST_URI'] |
Получить как/project/main.php?id=1Фрагмент URL. |
| виртуальный путь сценария | $_SERVER['PHP_SELF'] |
Получите путь к основной программе на веб-странице (без параметров). |
Письмо$mainTableView__whereclause, если вам нужно переключать условия SQL на основе разных главных страниц, вы можете написать так:
if (basename($_SERVER['SCRIPT_FILENAME']) == 'main.php') {
// Логика, которая выполняется только при входе из main.php
}
includeсутьВ PHP используйтеincludeилиrequire, вы можете думать об этом какНепосредственно «скопируйте и вставьте» импортированный в файл код в текущий файл.. Таким образом, оба будут использовать одну и ту же среду выполнения (область).
global?тебе решатьрасположение переменной вызова:
main.phpОпределите переменные и поместите их вlibrary.phpСамый внешний уровень использует его напрямую, без какого-либо дополнительного объявления.// основной.php $var1 = "Яблоко"; включить «library.php»; // библиотека.php эхо $var1; // Вывод: Apple
library.phpвнутриФункцияЧтобы получить к нему доступ, вы должны его объявить.
// library.php
function printVar() {
global $var1;
echo $var1;
}
include_onceнепонимание передаваемых параметровОсобое внимание:PHPinclude_once Не поддерживаетсяПередайте второй аргумент (например, массив). Его единственным параметром является строка пути к файлу.
| Неправильное использование (❌) | Правильное использование ( ✅) |
|---|---|
include_once('lib.php', ['v1' => $v1]); |
$v1 = "Data"; include_once 'lib.php'; |
| PHP сообщит об ошибке, поскольку количество параметров не совпадает. | Переменные автоматически перейдут в импортированный файл. |
Во избежание конфликтов имен переменных (загрязнения пространства имен) рекомендуется отказаться от метода записи «напрямую зависит от глобальных переменных» и использовать вместо него следующие два метода:
Воляlibrary.phpБудучи чистым набором инструментов, в нем пишутся только функции, а переменные передаются через параметры.
// библиотека.php
<?php
функция ProcessStock($name) {
возврат «Обработка запасов: » . $имя;
}
?>
// основной.php
<?php
include_once 'library.php';
echoprocessStock("TSLA"); // Передача переменных явно
?>
Это более распространено в современной разработке PHP (например, в концепциях Laravel) и позволяет эффективно организовать код.
// library.php
class StockTool {
public static function handle($var) {
return "Result: " . $var;
}
}
// main.php
include_once 'library.php';
echo StockTool::handle($var1);
1. не хочусуществоватьincludeПередача параметров в операторе недопустима.
2. Старайтесь избегатьglobal, использоватьпараметры функцииPass, чтобы код было легче отлаживать и поддерживать.
В PHP есть три основные основные функции для проверки того, была ли установлена (определена) переменная:isset()、empty()иarray_key_exists(). Их логика работы немного отличается, и выбор неправильной логики может привести к логическим дырам.
используется для определения переменныхБыло ли это объявленоиЕго ценность неNULL。
$var = "Близнецы";
если (isset($var)) {
echo "Переменная установлена и не равна NULL";
}
$var = null;,isset($var)отправлю обратноfalse。Используется для определения того, является ли переменнаяне существует, или его значение эквивалентноfalse. это эквивалентно!isset($var) || $var == false。
Следующие значения будутempty()рассматривается какtrue:
""(пустая строка)0(целое число 0)0.0(число с плавающей запятой 0)"0"(Строка 0)nullfalse[](пустой массив)| грамматика | Проверить цель | Подходит для сцены |
|---|---|---|
isset($var) |
Существует ли переменная и не равна ли она NULL | Проверьте необязательные поля, чтобы убедиться, что переменные определены. |
empty($var) |
Имеет ли переменная содержимое? | Проверка формы (убедитесь, что сообщение не пустое и количество не равно 0). |
is_null($var) |
Является ли переменная точно NULL | Когда вам просто нужно знать, было ли для переменной намеренно установлено значение null. |
Если вы находитесь вmain.phpПередать переменные вlibrary.php, рекомендуетсяlibrary.phpВыполните внутренние проверки на наличие ошибок:
// библиотека.php
если (isset($var1)) {
echo "Полученная переменная:" . $вар1;
} еще {
echo "Внимание: переменная var1 еще не определена.";
}
Это более краткий способ написания. Если переменная не установлена, ей присваивается значение по умолчанию.
// Если $var1 не установлен, $data равно «значению по умолчанию» $данные = $var1 ?? 'Значение по умолчанию';
Если вы передаете значение из внешнего интерфейса, метод проверки будет следующим:
if (isset($_GET['var1'])) {
$v1 = $_GET['var1'];
}
Советы:На этапе разработки рекомендуется добавитьerror_reporting(E_ALL);, так что если вы получите доступ к неопределенной переменной, PHP напрямую выдастNotice: Undefined variableИмейте в виду.
debug_backtrace()Это функция, используемая PHP для получения текущего стека выполнения (пути вызова). Его часто используют для отладки и записи источников звонков.
$trace = debug_backtrace();
print_r($trace);
debug_backtrace()Будет возвращен массив, упорядоченный в порядке вызова:
file:Путь к файлуline:Номер строки программыfunction:Имя вызываемой функцииclass: Название категории (если есть)args: передать параметрыфункция showCaller() {
$trace = debug_backtrace();
echo 'От: ' . $trace[1]['файл'] . ' Нет. ' . $trace[1]['строка'] . ' линия';
}
включить «subpageA.php»; // Вызов showCaller() внутри subpageA.php
main.php include subA.phpsubA.php include subB.phpsubB.phpиспользовать:$trace = debug_backtrace();
echo 'Текущий файл:' . $trace[0]['файл'] . "\п";
echo 'Предыдущий уровень:' . $trace[1]['файл'] . "\п"; // субA.php
echo 'Домашняя страница:' . $trace[2]['файл'] . "\п"; // основной.php
debug_backtrace()Это наиболее практичный способ просмотра источника вызовов включения/функций.error_log()Функция, используемая PHP для регистрации ошибок или пользовательских сообщений.
Он часто используется для отладки, отслеживания хода выполнения программы и записи исключений, не влияя на вывод на экран.<?php
error_log("Это тестовое сообщение");
?>
<?php
$data = ["a" => 1, "b" => 2];
error_log(print_r($data, true));
?>
<?php
error_log("Записать собственный файл", 3, "D:/logs/php_debug.log");
?>
<?php
error_log("[INFO] программа начинает выполнение");
error_log("Параметр [WARN] пуст");
error_log("[ОШИБКА] Не удалось подключиться к базе данных");
?>
php.iniконтроль:log_errors = On
error_log = "D:/logs/php_errors.log"
Если не установленоerror_log, по умолчанию будет:<?php
попробуй {
throw new Exception("Произошло исключение");
} catch (Исключение $e) {
error_log($e->getMessage());
}
?>
display_errors, просто используйтеerror_logКогда вы используете error_log() в PHP для записи строк, содержащих китайские символы, файл журнала часто отображается в шестнадцатеричной кодировке, например, в формате \xe6\xb2\x92. Обычно это не ошибка программирования, а результат того, что сервер (Apache/Nginx) заставляет экранировать символы, отличные от ASCII, по соображениям безопасности или совместимости.
Это самый простой и эффективный способ сделать это. Непосредственно манипулируя файлами, можно обойти серверный механизм фильтрации error_log().
функция write_utf8_log($message) {$log_file = DIR. '/debug.log'; $timestamp = date('Г-м-д ч: я: с'); // Используйте режим FILE_APPEND для записи необработанных байтов file_put_contents($log_file, "[$timestamp] $message" . PHP_EOL, FILE_APPEND | LOCK_EX); }
// Пример вызова $title = $_GET["title"]; write_utf8_log("Содержимое заголовка: " . $title);
Если вы хотите сохранить настройку пути error_log(), вы можете использовать json_encode с параметром JSON_UNESCAPED_UNICODE. Это заставит PHP выводить данные в формате UTF-8, но в некоторых серверных средах его все равно можно будет экранировать дважды.
$title = $_GET["title"]; error_log('title: ' . json_encode($title, JSON_UNESCAPED_UNICODE));
Если вы используете Apache 2.4+, вы можете попробовать изменить ErrorLogFormat, чтобы настроить поведение вывода журнала.
1. Определите формат файла конфигурации Apache (например, httpd.conf):
ErrorLogFormat "[%t] [%l] [pid %P] %F: %E: [client %a] %M"
2. Убедитесь, что язык операционной системы поддерживает UTF-8. Измените /etc/apache2/envvars в Ubuntu:
export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8
Если журнал сгенерирован и вы не можете изменить настройки сервера, вы можете использовать следующий метод для просмотра оригинального китайского языка:
| метод | преимущество | недостаток |
|---|---|---|
| Пользовательский журнал (file_put_contents) | 100% отображение на китайском языке, разрешение не требуется. | Требуется ручное управление размером файла и разрешениями. |
| JSON_UNESCAPED_UNICODE | Минимальные изменения кода | Все еще зависит от глобальной конфигурации сервера |
| Изменить конфигурацию Apache | Устраните все проблемы с системным журналом, выявив первопричину. | Требуются права администратора, перезапустите службу |
parse_url()сочетание функцийPHP_URL_QUERYКонстанта для получения части строки запроса из полного URL-адреса. Например:$url = "https://example.com/page.php?name=John&age=30&lang=php";
$query = parse_url($url, PHP_URL_QUERY); // Результат: "name=John&age=30&lang=php"
parse_str()Функция анализирует строку запроса в ассоциативный массив, где каждый набор имен и значений автоматически декодируется и преобразуется в элементы массива:parse_str($query, $params);
в это время$paramsСодержание:[
"name" => "John",
"age" => "30",
"lang" => "php"
]
<?php
$url = "https://example.com/page.php?name=John&age=30&lang=php";
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $params);
foreach ($params as $key => $value) {
echo "$key = $value\n";
}
?>
name = John
age = 30
lang = php
parse_url()Будет получена только часть запроса, а содержимое не будет анализироваться.parse_str()Может обрабатывать кодировку URL, например.%20будут преобразованы в пробелы.tags[]=php&tags[]=htmlбудет преобразован в массив.Используйте JavaScript<h1>контент, а затем отправить его на PHP:
<!DOCTYPE html>
<html lang="zh-Hant">
<голова>
<мета-кодировка="UTF-8">
<title>Получить контент H1</title>
<скрипт>
функция sendH1Content() {
вар h1Content = document.querySelector('h1').innerText;
вар xhr = новый XMLHttpRequest();
xhr.open('POST', 'process.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('h1Content=' + encodeURIComponent(h1Content));
}
window.onload = sendH1Content;
</скрипт>
</голова>
<тело>
<h1>Это заголовок страницы</h1>
</тело>
</html>
существоватьprocess.phpПолучайте и обрабатывайте контент H1 в:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$h1Content = $_POST['h1Content'] ?? '';
// Обработка $h1Content, например сохранение его в базе данных или выполнение других операций
echo "Получено содержимое H1: " . htmlspecialchars($h1Content);
}
?>
Если HTML-файл статический, вы можете использовать PHP для чтения файла и его анализа:
<?php
$htmlContent = file_get_contents('путь/к/вашему/файлу.html');
preg_match('/<h1>(.*?)<\/h1>/', $htmlContent, $matches);
$h1Content = $matches[1] ?? '';
// обрабатываем $h1Content
echo "Содержимое H1: " . htmlspecialchars($h1Content);
?>
Самый распространенный способ — использовать JavaScript для получения контента на стороне клиента и последующей отправки его в PHP для обработки через AJAX. Синтаксический анализ на стороне сервера обычно используется для статического содержимого и не рекомендуется для динамически генерируемых страниц.
abc.phpНесколько из них были напечатаны<h2>, затем включитеsubpage.phpКогда , содержимое не может быть получено из выходного HTML.
Правильный способ — ─ ** передать содержимое последнего тега <h2> в subpage.php** (переменную) из abc.php перед включением, и она будет использоваться subpage.php.<!-- abc.php -->
<h2>AAA</h2>
<h2>BBB</h2>
<h2>lasth2</h2>
<?php
$last_h2 = "lasth2";
include "subpage.php";
?>
<!-- subpage.php -->
<?php
echo "Последний H2 на главной странице: " . $last_h2;
?>
<!-- abc.php -->
<?php
ob_start(); // Начинаем буферизацию
?>
<h2>ААА</h2>
<h2>BBB</h2>
<h2>last2</h2>
<?php
$html = ob_get_clean(); // Получаем весь вывод и очищаем буфер
preg_match_all('/<h2>(.*?)<\\/h2>/i', $html, $matches);
$last_h2 = end($matches[1]); //Содержимое последнего h2
включить «subpage.php»;
//Наконец распечатываем исходный HTML
эхо $html;
?>
<!-- abc.php -->
<?php
$h2_list = ["AAA", "BBB", "lasth2"];
?>
<h2>AAA</h2>
<h2>BBB</h2>
<h2>lasth2</h2>
<?php
$last_h2 = end($h2_list);
include "subpage.php";
?>
ob_start()+ Разбор регулярных выраженийurlencode()Функция используется для URL-кодирования (процентного кодирования) строки. При передаче данных в качестве параметров URL-адреса это обязательный шаг, обеспечивающий правильную передачу и анализ всех специальных символов.
string urlencode(string $string): stringЭта функция преобразует данную строку в безопасный для URL-адресов формат. Он заменяет все небуквенно-цифровые символы, кроме знака минус (-), итоговая строка (_), период (.) и тильда (~) снаружи.
Замененные специальные символы будут заменены знаками процентов (%), за которым следует двузначное шестнадцатеричное представление значения ASCII символа (например, пробел $\rightarrow$%20)。
?、&、=、/) имеет особое значение. Если эти символы включены в параметры, браузер или сервер могут неправильно понять структуру URL-адреса.urlencode()Эти символы закодированы в формате UTF-8.urlencode()преобразует пробелы в знаки плюс (+) или%20(Хотяurlencode()То, что производится,+, но в параметрах URL оба представления представляют собой пробелы).$data = "PHP Array со скидкой 100 долларов и 50 %"; $encoded_data = urlencode($data); echo "<h3>Специальные символы и примеры китайского языка</h3>"; echo "<p>Исходная строка: " . htmlspecialchars($данные) . "</p>"; echo "<p>Результат кодирования: " . htmlspecialchars($encoded_data) . "</p>"; // Результаты вывода аналогичны: PHP+array и +%24100+%26+50%25+offer // (Китайский массив будет закодирован как %E9%99%A3%E5%88%97 и т. д.)
Предположим, вам нужно изменить строку запросаq_strНадежно добавляется к URL-адресу API.
$api_base = "http://api.example.com/search"; $search_query = "Советы по мобильной фотографии (2025 г.)"; // Обеспечиваем безопасность строки запроса $encoded_query = urlencode($search_query); //Создаем конечный URL $final_url = $api_base. "?q_str=" . $ закодированный_запрос; echo "<h3>Пример создания URL</h3>"; echo "<p>Строка запроса: " . htmlspecialchars($search_query) . "</p>"; echo "<p>Конечный URL: " . htmlspecialchars($final_url) . "</p>"; // Конечный URL аналогичен: http://api.example.com/search?q_str=%E6%89%8B%E6%A9%9F%E6%94%9D%E5%BD%B1%E6%8A%80%E5%B7%A7+%282025+%E5%B9%B4%29
PHP имеет еще одну похожую функциюrawurlencode(), основная разница между ними заключается в обработке пробелов:
urlencode(): Преобразовать пробелы в знаки плюс (+). Обычно это используется для кодирования значения **параметра GET** (например,?key=valueвvalueчасть).rawurlencode(): Преобразовать пробелы в%20. Это согласуется сRFC 3986Более строгое определение, обычно используемое для кодирования **сегментов пути** (сегментов пути) URL-адреса или когда вам нужны точные%20скорее, чем+час.$space_test = "Это тест"; echo "<h3>urlencode() vs rawurlencode()</h3>"; echo "<p>urlencode(): " . urlencode($space_test) . "</p>"; // Вывод: Это+есть+тест echo "<p>rawurlencode(): " . rawurlencode($space_test) . "</p>"; // Вывод: этот %20is%20a%20test
ob_start(): Включить буферизацию вывода.ob_get_contents(): Получить текущий буферизованный контент.ob_end_clean(): Завершить буферизацию и очистить без вывода.ob_end_flush(): Завершить буферизацию и вывести содержимое.ob_get_clean(): получить содержимое и завершить буферизацию.<?php
ob_start(); // Начинаем буферизацию вывода
echo «Привет, мир!»;
$content = ob_get_clean(); // Получаем и очищаем содержимое буфера
эхо strtoupper($content); // Вывод измененного содержимого: HELLO WORLD!
?>
<?php
ob_start();
Register_shutdown_function (функция () {
$html = ob_get_clean();
echo "<div class='container'>" . $html. "</div>";
});
?>
<h1>Название контента</h1>
<p>Это абзац содержания. </p>
<h2>Заголовок и блок под ним, а справа добавьте соответствующее изображение. Файлы изображений именуются по порядку.h2-1.jpg、h2-2.jpg... и так далее, его необходимо заранее поместить в назначенную папку с файлом изображения.h2-image-right.php):
<?php
ob_start();
function add_images_next_to_h2($html) {
$pattern = '/(<h2.*?>.*?<\/h2>)(.*?)(?=<h2|\z)/is';
$index = 1;
return preg_replace_callback($pattern, function($matches) use (&$index) {
$h2 = $matches[1];
$body = $matches[2];
$imgPath = "/images/h2-$index.jpg";
$imgFile = $_SERVER['DOCUMENT_ROOT'] . $imgPath;
if (file_exists($imgFile)) {
$output = "<div style='display: flex; align-items: flex-start; gap: 20px; margin-bottom: 1.5em;'>";
$output .= "<div style='flex: 1;'>" . $h2 . $body . "</div>";
$output .= "<img src='$imgPath' style='max-width: 200px; height: auto; border: 1px solid #ccc;'>";
$output .= "</div>";
} else {
$output = $h2 . $body;
}
$index++;
return $output;
}, $html);
}
register_shutdown_function(function() {
$html = ob_get_clean();
echo add_images_next_to_h2($html);
});
?>
/images/папка, например:/images/h2-1.jpg/images/h2-2.jpg/images/h2-3.jpg<?php включает "h2-image-right.php"; ?>
<h2>Заголовок первого абзаца</h2>
<p>Это содержание первого абзаца. </p>
<h2>Заголовок второго абзаца</h2>
<p>Это содержание второго абзаца. </p>
<h2>Пожалуйста, назовите их соответственно в порядке их появления.<h2> ~ Содержание нижеЭто гибкий блок, подходящий для страниц с чистым контентом.ob_start()。Проверка журналов сервера — важный способ выявления ботов поисковых систем. Вот несколько примеров User-Agent для роботов поисковых систем:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)Проверьте сайтrobots.txtФайл, который позволяет узнать, каким роботам поисковых систем разрешен или запрещен доступ к определенным частям вашего веб-сайта. Например:
User-agent: *
Disallow: /private/
Боты поисковых систем обычно имеют IP-адреса из определенного диапазона. Вы можете сравнить, попадает ли IP-адрес посетителя в эти диапазоны. Например:
Инструменты можно использовать для проверки того, действительно ли IP-адрес посетителя получен из поисковой системы.
Ниже приведен пример использования PHP на стороне сервера для проверки User-Agent:
<?php
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (strpos($userAgent, 'Googlebot') !== false) {
echo «Это трафик Googlebot»;
} еще {
echo «Это не трафик поисковых роботов»;
}
?>
Используйте Google Analytics или другие инструменты веб-аналитики, чтобы отслеживать источники трафика. Эти инструменты обычно автоматически фильтруют большую часть трафика ботов.
Хэш-значение URL-адреса относится к части URL-адреса после символа «#», также известной как идентификатор фрагмента (идентификатор фрагмента). Обычно он используется для определения местоположения или состояния на странице.
Вот несколько распространенных примеров хеша URL-адреса:
https://example.com/page#section1https://example.com/app#/dashboardhttps://example.com/search#filter=activeid。<скрипт>
// Получаем хеш-значение URL-адреса
const hashValue = window.location.hash.substring(1);
//Отображение хеш-значения
console.log("Хеш-значение:", hashValue);
</скрипт>
<?php
// Фейковый URL
$url = "http://example.com/page#section2";
// Используйте parse_url для анализа хеш-значений
$parsedUrl = parse_url($url);
$hash = isset($parsedUrl['фрагмент']) ? $parsedUrl['фрагмент']: ноль;
// Выходное хэш-значение
если ($хеш) {
echo "Значение хеша: " . htmlspecialchars($hash, ENT_QUOTES, 'UTF-8');
} еще {
echo "В URL-адресе нет хеша.";
}
?>
window.location.hash。nameсвойствоНесмотря на то, что он используется реже, можноnameДобавить атрибут<a>тег и поместите его перед целевым тегом.
<a name="специфический-заголовок1"></a> <h3>Целевой заголовок 1</h3> <a href="#specific-heading1">Ссылка на конкретный заголовок</a>
Эффект:
data-attributeС помощью JavaScriptУстанавливая пользовательские свойства, такие какdata-anchorи используйте JavaScript для обработки поведения перехода.
<h3 data-anchor="heading-1">Целевой заголовок 3</h3>
<a href="#" onclick="jumpToHeading('heading-1')">Ссылка на конкретный заголовок</a>
<скрипт>
функция jumpToHeading(якорь) {
const target = document.querySelector(`[data-anchor="${anchor}"]`);
если (цель) {
target.scrollIntoView({ поведение: 'smooth' });
}
}
</скрипт>
Эффект:
h2текстовый контент с помощью JavaScriptпо поискуh2текстовое содержимое для таргетинга, используя JavaScript для динамического таргетинга на цель.
<h3>Целевой заголовок 5</h3>
<a href="#" onclick="jumpToText('Target Title')">Ссылка на конкретный заголовок</a>
<скрипт>
функция jumpToText(текст) {
const target = Array.from(document.querySelectorAll('h2')).find(el => el.textContent === text);
если (цель) {
target.scrollIntoView({ поведение: 'smooth' });
}
}
</скрипт>
Эффект:
cURL — это библиотека, используемая в PHP для отправки HTTP-запросов. Он поддерживает GET, POST, PUT, DELETE и другие методы и часто используется для доступа к данным API.
curl_init()curl_setopt()curl_exec()curl_close()<?php
$url = "https://api.example.com/data";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
<?php
$url = "https://api.example.com/post";
$data = ['name' => 'Test', 'email' => '[email protected]'];
$ch = curl_init($url);
Curl_setopt ($ ch, CURLOPT_POST, правда);
Curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
Curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, правда);
$response = curl_exec($ch);
локон_закрыть ($ ч);
эхо $ответ;
?>
<?php
$url = "https://api.example.com/json";
$data = json_encode(['id' => 123]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($data)
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
CURLOPT_URL: Установить целевой URLCURLOPT_RETURNTRANSFER: возвращать ли результат (не выводить напрямую)CURLOPT_POSTFIELDS:Отправленная информацияCURLOPT_HTTPHEADER: Пользовательские заголовки HTTP.<?php
если (curl_errno ($ ch)) {
эхо 'Ошибка:'. Curl_error ($ ч);
}
?>
В PHP проверьте, прослушивается ли определенный сетевой порт (Порт), обычно чтобы убедиться, что локальная или удаленная служба работает и принимает соединения. Самый распространенный метод — использовать функции, связанные с сокетами, чтобы попытаться установить TCP-соединение.
fsockopen()Функция используется для открытия сетевого подключения или соединения сокета домена Unix. Если соединение успешное, это означает, что порт прослушивается; если соединение не установлено, это обычно означает, что порт не открыт или заблокирован брандмауэром.
/**
* Проверьте, прослушивается ли порт на указанном IP/имени хоста
*
* @param string $host Имя хоста или IP-адрес для проверки.
* @param int $port Номер порта, который необходимо проверить.
* @param int $timeout Таймаут соединения (секунды)
* @return bool Если соединение успешное, верните true; в противном случае верните ложь
*/
function is_port_listening(string $host, int $port, int $timeout = 2): bool {
// Устанавливаем соединение Socket. Символ @ используется для подавления сообщений об ошибках соединения.
$connection = @fsockopen($host, $port, $errno, $errstr, $timeout);
если (is_resource($connection)) {
// Если $connection является типом ресурса, это означает, что соединение успешно
fclose($соединение); //Закрываем соединение сразу после успеха
вернуть истину;
} еще {
// Соединение не удалось. Возможно, порт не открыт или служба не запущена.
// Необязательно: вы можете напечатать здесь $errstr и $errno для отладки
// echo "Соединение не удалось: $errstr ($errno)<br>";
вернуть ложь;
}
}
// --- Тестовый пример ---
$remote_host = 'www.google.com';
$remote_port = 80; // Проверяем HTTP-порт Google
$local_host = '127.0.0.1';
$local_web_port = 80; // Проверяем порт локального веб-сервера
$ незанятый_порт = 65432; // Предположим, что этот порт не используется
echo "<h3>Результаты проверки мониторинга портов</h3>";
// Проверяем удаленный сервис
если (is_port_listening($remote_host, $remote_port)) {
echo "<p>{$remote_host}: {$remote_port} прослушивает (соединение успешно).</p>";
} еще {
echo "<p>{$remote_host}:{$remote_port} не открыт или соединение не установлено.</p>";
}
// Проверка локального веб-сервера (если ваш веб-сервер работает на порту 80)
если (is_port_listening($local_host, $local_web_port)) {
echo "<p>{$local_host}:{$local_web_port} прослушивает (веб-сервер работает).</p>";
} еще {
echo "<p>{$local_host}:{$local_web_port} не слушает.</p>";
}
// Проверяем наличие незанятого порта
if (is_port_listening($local_host, $unoccupied_port)) {
echo "<p>{$local_host}: {$unoccupied_port} прослушивает.</p>";
} еще {
echo "<p>{$local_host}:{$unoccupied_port} не прослушивается (ожидаемый результат).</p>";
}
Если вам нужны операции Socket более низкого уровня (например, параметры настройки, неблокирующий режим и т. д.), вы можете использовать библиотеку функций Socket PHP (необходимо включитьphp_socketsрасширение).
функция is_port_listening_socket(строка $host, int $port): bool {
// Создаем сокет TCP/IP
$socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
если ($socket === ложь) {
// echo "Ошибка создания сокета: " . сокет_strerror(socket_last_error()) . "<br>";
вернуть ложь;
}
//Попробуем подключиться
// Socket_connect() попытается установить соединение на указанном хосте и порту
$result = @socket_connect($socket, $host, $port);
сокет_закрыть ($ сокет);
return ($result!== false);
}
$timeoutзначение (например, 2–5 секунд). Без этого параметра ваш скрипт может блокироваться на долгое время, когда целевой хост недоступен.fsockopen()Это все равно потерпит неудачу.fsockopen()Функции обычно не включаются в файлы конфигурации PHP.allow_url_fopenОграничение команды, поскольку она работает непосредственно с сетевыми сокетами.$hostустановлен на127.0.0.1илиlocalhost。
В PHP, чтобы получить результаты веб-API и проанализировать JSON, вы обычно используетеfile_get_contents()или библиотеку cURL для отправки HTTP-запросов, а затем используйтеjson_decode()Функция для анализа возвращаемой строки JSON.
Для простого запроса GET:file_get_contents()это быстрый метод. Но если API требует определенных HTTP-заголовков или более сложных запросов, больше подойдет cURL.
$api_url = 'https://jsonplaceholder.typicode.com/posts/1'; // Пример URL-адреса API
// Получаем содержимое, возвращаемое API (строка формата JSON)
$json_data = @file_get_contents($api_url);
если ($json_data === ЛОЖЬ) {
echo «Невозможно получить данные API или не удалось выполнить запрос API.»;
} еще {
// Разбираем строку JSON в массив или объект PHP
// Для второго параметра установлено значение true, и он будет преобразован в ассоциативный массив.
// Установите значение false (по умолчанию) для анализа объекта.
$data = json_decode($json_data, true);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
echo "Ошибка анализа JSON:" .json_last_error_msg();
} еще {
echo "<h3>API возвращает данные (связанный массив)</h3>";
//Пример: доступ к определенным полям данных
echo "<p>title (заголовок): " . htmlspecialchars($data['title']) . "</p>";
echo "<p>Содержимое (тело): " . htmlspecialchars($data['body']) . "</p>";
// Выводим полную структуру для проверки
echo "<h4>Полная структура данных (print_r)</h4>";
эхо "<pre>";
print_r ($ данные);
эхо "</pre>";
}
}
cURL обеспечивает больше контроля, например настройку методов запроса (POST, PUT, DELETE), заголовков, таймаутов и т. д.
$api_url = 'https://jsonplaceholder.typicode.com/posts/2';
//Инициализируем сеанс cURL
$ch = Curl_init();
//Устанавливаем параметры cURL
Curl_setopt ($ ch, CURLOPT_URL, $ api_url);
Curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, правда); // Возвращаем результат в виде строки вместо того, чтобы выводить его напрямую
//Выполняем сеанс cURL и получаем результаты
$json_data = curl_exec($ch);
// Проверяем, произошла ли ошибка
если (curl_errno($ch)) {
echo «Ошибка cURL:». Curl_error ($ ч);
$данные = ноль;
} еще {
// Анализ JSON
$data = json_decode($json_data, true);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
echo "Ошибка анализа JSON:" .json_last_error_msg();
}
}
// Закрываем сессию cURL
локон_закрыть ($ ч);
если ($ данные !== ноль) {
echo "<h3>API возвращает данные (пример cURL)</h3>";
echo "<p>title (заголовок): " . htmlspecialchars($data['title']) . "</p>";
echo "<p>Идентификатор пользователя (userId): " . htmlspecialchars($data['userId']) . "</p>";
}
json_decode($json_string, $associative)true, затем верните связанный массив; еслиfalse(по умолчанию), объект возвращается.PHPexec()функция иshell_exec()、system()Аналогичным образом, это, по сути, синхронная блокировка, то есть сценарий PHP будет ждать завершения внешней команды, прежде чем продолжить. Чтобы выполнять внешние команды без блокировки основной программы PHP (реализуя «асинхронное» или «фоновое выполнение»), мы должны полагаться на особенности самой оболочки для разделения команд.
Ключом к достижению неблокирующего выполнения является передачаexec()Добавьте специальный синтаксис Shell в командную строку:
&:** Это основной символ для перевода команд в фоновое выполнение.> /dev/null 2>&1:** Это ключ к предотвращению блокировки PHP. Он перенаправляет стандартный вывод (STDOUT) и стандартный вывод ошибок (STDERR) на пустое устройство./dev/null. Без перенаправления, даже если использовать&символ, некоторые версии PHP все еще могут ожидать закрытия потока ввода-вывода, вызывая ложную блокировку.nohup(Необязательно, но рекомендуется): ** В системах Linux/Unix используйтеnohupЭто гарантирует, что процесс продолжит работу после завершения работы веб-сервера, например, когда HTTP-запрос завершается или пользователь закрывает браузер.Этот пример подходит для кратковременных фоновых задач, которые не нужно запускать после завершения HTTP-запроса.
$command_to_run = 'php /path/to/my_long_task.php arg1 arg2'; // Объединяем неблокирующие команды // 1. Сама команда // 2. Направляем STDOUT в /dev/null // 3. Направляем STDERR (2) в STDOUT (&1) // 4. Используйте символ &, чтобы сдвинуть фон $async_command = $command_to_run. ' > /dev/null 2>&1 &'; $выход = []; $return_var = 0; //Выполняем неблокирующие команды exec($async_command, $output, $return_var); echo "<h3>Результат асинхронного выполнения (exec)</h3>"; echo "<p>Команда отправлена на фоновое выполнение.</p>"; echo "<p>PHP-скрипты продолжат выполнение немедленно и не будут ждать завершения внешних скриптов.</p>"; echo "<p>Выходной массив (\$output), возвращаемый exec(), будет почти пуст.</p>";
В этом примере используетсяnohupЧтобы гарантировать, что фоновая задача полностью отделена от родительского процесса веб-сервера PHP, задача будет продолжать выполняться, даже если веб-сервер выключен.
$command_to_run = '/usr/bin/python3 /path/to/process_data.py'; $log_file = '/var/log/my_app/task_log.log'; // Специальный файл журнала // Убедитесь, что параметры команды правильно экранированы, чтобы предотвратить атаки с внедрением оболочки $safe_command = escapeshellcmd($command_to_run); // Прямой вывод и вывод ошибок в файл журнала вместо /dev/null $detached_command = 'nohup'. $безопасная_команда. ' >> ' . escapeshellarg($log_file) . ' 2>&1 &'; exec($detached_command); echo "<h3>Используйте nohup, чтобы отсоединить процесс</h3>"; echo "<p>Команда была запущена с использованием nohup и направила вывод в файл журнала.</p>"; echo "<p>Задача будет продолжать выполняться в фоновом режиме до завершения.</p>";
Безопасность является наиболее важным фактором при выполнении внешних команд. **Никогда** не передавайте несанкционированный или экранированный пользовательский ввод вexec()или другие исполняемые функции оболочки. PHP предоставляет две функции для помощи в обработке:
escapeshellcmd($command): экранируйте **всю командную строку**, чтобы злоумышленники не могли вставить несколько команд.escapeshellarg($arg):Escape **один параметр**, чтобы гарантировать, что параметр обрабатывается как одна строка.$user_input = "тест; rm -rf /"; // Потенциально вредоносный ввод
// Ошибка: небезопасная практика
// exec('my_script.sh' . $user_input);
// Правильно: безопасный подход
$safe_input = escapeshellarg($user_input);
$safe_command = 'my_script.sh'. $safe_input;
//Результат выполнения: my_script.sh 'test; rm -rf /' (рассматривается как один параметр)
exec()shell_exec()passthru()proc_open()(Передовой)<?php
$cmd = "python3 myscript.py 123";
$output = shell_exec($cmd);
echo $output;
?>
<?php
$arg1 = 100;
$arg2 = "hello";
$cmd = "python3 script.py " . escapeshellarg($arg1) . " " . escapeshellarg($arg2);
$result = shell_exec($cmd);
echo $result;
?>
#script.py
импортсистем
а = sys.argv[1]
б = sys.argv[2]
print(f"Входные параметры: {a}, {b}")
<?php
exec("python3 test.py", $output_lines, $status);
echo "<pre>";
print_r($output_lines);
echo "</pre>";
?>
<?php
$дескриптор = [
0 => ["труба", "р"],
1 => ["труба", "ш"],
2 => ["труба", "ш"]
];
$process = proc_open("python3calc.py", $descriptor, $pipes);
если (is_resource($process)) {
fwrite($pipes[0], "50\n");
fclose($pipes[0]);
$output =stream_get_contents($pipes[1]);
fclose($pipes[1]);
$error =stream_get_contents($pipes[2]);
fclose($pipes[2]);
proc_close($процесс);
echo "Вывод: $output<br>";
echo "Ошибка: $error<br>";
}
?>
/usr/bin/python3илиC:\\Python39\\python.exeescapeshellarg()Запретить внедрение командphp -mПодтвердить загрузкуphp-gtkМоды.<?php
если (!class_exists('gtk')) {
die("PHP-GTK не установлен\n");
}
$window = новый GtkWindow();
$window->set_title("Пример PHP-GTK");
$window->set_size_request(300, 200);
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
$button = new GtkButton("Нажмите на меня");
$button->connect_simple('нажал', function() {
echo "Кнопка нажата!\n";
});
$window->add($button);
$window->show_all();
Gtk::main();
?>
Electron(На основе Chromium и Node.js) Создайте графический интерфейс рабочего стола, и серверная часть по-прежнему сможет вызывать программы PHP.
Это позволяет создавать красивые кроссплатформенные приложения с использованием HTML/CSS/JavaScript и взаимодействовать с PHP через API.php -S localhost:8000),
Затем с помощью браузера откройте страницу, и она будет выглядеть как настольное приложение. С помощью PWA (Progressive Web App) его также можно установить в виде значка на рабочем столе.Одностраничное приложение (SPA) — это веб-приложение или модель веб-сайта, которое взаимодействует с пользователями путем динамического переписывания текущей страницы вместо загрузки с сервера целиком новой страницы. Такой подход позволяет избежать перерывов между переключениями страниц и приближает взаимодействие с пользователем к настольному приложению.
В традиционной модели при каждом нажатии ссылки с сервера запрашивается новый HTML-файл; в SPA необходимые HTML, CSS и JavaScript загружаются только при первой загрузке, а последующий обмен данными осуществляется через AJAX или Fetch API.
| характеристика | SPA (одностраничное приложение) | MPA (многостраничное приложение) |
|---|---|---|
| Загрузка страницы | Загружать только один раз, частично обновлено | Перезагружайте всю страницу при каждой операции |
| Пользовательский опыт | Гладкая, без ощущения прыжка | Очевидный белый экран и ощущение ожидания |
| Нагрузка на сервер | Нижний (передаёт только данные JSON) | Выше (HTML должен отображаться каждый раз) |
| SEO-оптимизация | Более сложный и требует дополнительной обработки | Легко и естественно для поисковых систем |
Это не зависит от платформы и использует только собственный JavaScript для имитации логики переключения содержимого SPA:
<!-- index.html -->
<навигация>
<a href="#home" onclick="route()">Домашняя страница</a>
<a href="#trading" onclick="route()">Торговые графики</a>
</навиг>
<div id="content">
<!-- Сюда будет добавлен динамический контент -->
</div>
<скрипт>
константные маршруты = {
"#home": "<h2>С возвращением</h2><p>Это ваша панель управления.</p>",
"#trading": "<h2>Котировки в реальном времени</h2><div id='tv-container'>Загрузка графика...</div>"
};
функция маршрут() {
константный хеш = window.location.hash || "#дом";
const contentDiv = document.querySelector("#content");
contentDiv.innerHTML = маршруты [хэш];
// Если вы переключитесь на торговую страницу, вы можете инициализировать предыдущий виджет TradingView здесь
if (хэш === "#trading") {
// initTradingView();
}
}
// Отслеживание изменений URL
window.addEventListener("hashchange", маршрут);
// начальная загрузка
маршрут();
</скрипт>
преимущество:Высокая скорость, уменьшенное потребление полосы пропускания и отдельная разработка внешнего и внутреннего интерфейса (внутренняя часть должна предоставлять только API).
недостаток:Начальное время загрузки велико (первая загрузка), и SEO необходимо компенсировать с помощью SSR (серверный рендеринг) или технологии предварительного рендеринга.
При разработке одностраничного приложения (SPA) выбор подходящего фреймворка может значительно повысить эффективность разработки и удобство сопровождения кода. На текущем рынке доминируют три основные платформы, среди которых появляется много многообещающих.
Разработанная и поддерживаемая Meta (Facebook), в настоящее время это наиболее используемая библиотека функций пользовательского интерфейса в мире. Он представляет Virtual DOM (Virtual DOM) и синтаксис JSX, подчеркивая компонентизацию и односторонний поток данных.
Разработанный Ю Юйси, он известен своей «прогрессивной» структурой. Его кривая обучения относительно щадящая, и официальный поставщик предоставляет очень полную цепочку инструментов, которая очень подходит для проектов, ориентированных на эффективность разработки.
Полная структура, поддерживаемая Google и написанная на TypeScript. Он предоставляет решение «Семейное ведро», включающее все необходимые функции, такие как маршрутизация, проверка форм и HTTP-клиенты.
В дополнение к трем вышеупомянутым основным платформам в последние годы появилось множество альтернатив оптимизации производительности:
| Имя кадра | Функции |
|---|---|
| Svelte | Никакого виртуального DOM, программный код преобразуется в эффективный собственный JS на этапе компиляции. |
| SolidJS | Похож на синтаксис React, но с максимальной производительностью. |
| Preact | Облегченная версия React, размером всего около 3 КБ и обладающая высокой совместимостью. |
При выборе фреймворка обычно рекомендуется учитывать следующие критерии:
В экосистеме Python решения для разработки SPA (одностраничных приложений) в основном делятся на две категории: одна использует Python в качестве внутреннего API, а другая использует специальную структуру, которая позволяет разработчикам автоматически генерировать интерфейсный интерфейс с функциями SPA, просто написав код Python.
Эти платформы являются наиболее популярными, поскольку они не требуют от разработчиков знаний HTML/CSS/JS для мгновенной разработки интерактивных одностраничных веб-страниц.
Этот тип фреймворка пытается бросить вызов традиционной модели React/Vue + FastAPI и сделать полноценную разработку более унифицированной.
| Имя кадра | Функции | Техническая архитектура |
|---|---|---|
| Рефлекс (ранее известный как Pinecone) | Написан на чистом Python и скомпилирован в приложение React. | Python + Next.js / Tailwind |
| NiceGUI | Чрезвычайно простой синтаксис, подходящий для управления оборудованием, гаджетами или простыми веб-страницами. | Python + Vue / Quasar |
| Flet | Платформа Python, основанная на Flutter, которую можно публиковать одновременно как веб-SPA и настольное приложение. | Python + Flutter |
Это наиболее стандартная модель разработки коммерческого программного обеспечения. Python отвечает только за логику и данные, а интерфейс остается на усмотрение профессиональной среды JavaScript.
// Диаграмма архитектуры Бэкэнд (Python): FastAPI/Django Ninja/Flask Транспортный протокол: RESTful API или WebSocket. Интерфейс (JavaScript): Vue.js/React/Svelte (отвечает за рендеринг SPA)
Это очень популярная тенденция последних лет. HTMX позволяет традиционным веб-фреймворкам Python (таким как Django или Flask) достигать эффекта частичного обновления страницы AJAX без написания сложного JavaScript.
# Пример Django + HTMX (кнопка частичного обновления)
# После нажатия будет заменена только область #result, а веб-страница не обновится.
<button hx-post="/get-data/" hx-target="#result">
Нажмите меня, чтобы получить данные
</кнопка>
<div id="result">Ожидание...</div>
Основная концепция этого типа решения — «возврат к HTML». Они утверждают, что нет необходимости писать сложные JavaScript-фреймворки для достижения динамических эффектов SPA.
WebAssembly позволяет разработчикам писать логику на стороне браузера, используя высокопроизводительные языки, такие как C++, Rust или Go, нарушая монополию JavaScript.
| язык | основная рама | особенность |
|---|---|---|
| C# / .NET | Blazor WebAssembly | Разрешить .NET-разработчикам писать интерфейсные части на C# вместо JS. |
| Rust | Yew / Leptos | Экстремальная производительность исполнения и строгая типобезопасность. |
| Go | Hugo / TinyGo | Компиляция происходит чрезвычайно быстро и подходит для выполнения логически сложных операций. |
Этот тип решения генерирует все страницы в статические HTML-файлы во время сборки, которые загружаются очень быстро и очень удобны для SEO.
Решение, запущенное Google, использует язык Dart. Он не использует стандартный путь рендеринга HTML/CSS, а рисует весь интерфейс через Canvas.
// Пример логики флаттера
недействительный основной () {
runApp(const MyApp());
}
// Интерфейс полностью нарисован с помощью Canvas, который подходит для трансплантации приложений с высокой визуальной согласованностью.
Для внутренних корпоративных инструментов или требований быстрого запуска SPA можно создать без рукописного кодирования.
| план | Применимые ситуации | Технический порог |
|---|---|---|
| HTMX | Обновление традиционных веб-сайтов с ощущением интерактивности | Низкий (требуется только серверный язык) |
| WebAssembly | Обработка изображений, сложные операции, игры | Высокий (требуется основа языка компиляции) |
| Astro (SSG) | Блог, документы, официальный сайт | середина |
| Flutter for Web | Приложение публикуется одновременно на веб-странице | Средний (требуется Дарт) |
Традиционные веб-архитектуры, такие как PHP + JavaScript, обычно используются при развертывании на стороне сервера, но не могут эффективно предотвратить доступ или копирование исходного кода, поэтому они не подходят для коммерческого лицензирования и развертывания в ненадежных средах. Для решения этой проблемы возникла архитектура «Самостоятельное веб-приложение». Он компилирует внутреннюю логику в нечитаемый исполняемый файл и имеет встроенные возможности службы HTTP, позволяя интерфейсной части по-прежнему взаимодействовать с HTML/JS, в то время как серверная часть может реализовывать шифрование, безопасность, контроль авторизации и другие требования.
| имя | Использовать язык | Поддерживать ли управление лицензиями | Поддерживает ли он C#? | Может создавать двоичные файлы | подходит для цели | Уровень использования/доля рынка |
|---|---|---|---|---|---|---|
| Electron | JavaScript + Node.js | Может использоваться с системой проверки | нет | Да (приложение для ПК) | Кроссплатформенное настольное веб-приложение | очень высокий |
| Node.js + pkg | JavaScript | Может использоваться с JWT/проверкой ключа. | нет | да | Инкапсуляция приложений веб-API | высокий |
| ASP.NET Core + Kestrel | C# | Встроенная поддержка | да | Да (.exe/.dll) | Корпоративный веб-API/инструменты | высокий |
| Go HTTP Server | Go | Встроенный или индивидуальный | нет | да | Высокопроизводительный веб-сервер | высокий |
| Blazor WebAssembly + ASP.NET | C# | Поддержка проверки авторизации | да | да | Интеграция SPA + веб-API | От среднего до высокого |
| Gradio | Python | Может использоваться третьими лицами | нет | Можно (PyInstaller) | ML/AI Web UI | середина |
| Streamlit | Python | Может использоваться третьими лицами | нет | Можно (PyInstaller) | Веб-интерфейс визуализации данных | середина |
| Tauri | Rust + JS | Поддержка пользовательской проверки | нет | да | Сверхлегкое настольное приложение | середина |
| Mongoose / Civetweb | C / C++ | Встроенная логика проверки | Да (с CLI) | да | Встроенный веб-сервер | середина |
ASP.NET Core — это кроссплатформенная высокопроизводительная платформа веб-приложений с открытым исходным кодом, разработанная Microsoft и поддерживающая Windows, Linux и macOS. Он является частью платформы .NET и предназначен для современных веб-API, веб-приложений и микросервисов. По сравнению с традиционным ASP.NET версия Core более легкая, модульная и может быть скомпилирована в независимый исполняемый файл (.exe), что очень подходит для самоинкапсулируемой архитектуры веб-приложений.
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
Эта команда может скомпилировать приложение ASP.NET Core в автономный исполняемый файл (например, MyApp.exe), который можно запустить непосредственно в целевой системе без установки .NET Runtime.
ASP.NET Core можно использовать в качестве серверной части .NET MAUI + Blazor для предоставления данных и API.
Если у вас уже есть веб-проект Blazor, вы можете практически безболезненно переместить его в приложение MAUI и повторно использовать большой объем кода.
ASP.NET Core ориентирован на серверную часть и веб-архитектуру и подходит для разработки облака и API.
.NET MAUI + Blazor ориентирован на кроссплатформенные приложения на стороне пользователя и особенно подходит для команд, у которых уже есть стек интерфейсных технологий Blazor.
Когда они объединены, может быть достигнуто комплексное решение «внутренняя служба + внешнее кроссплатформенное приложение».
| IDE | Платформа поддержки | особенность | Это бесплатно? | Подходит для объектов |
|---|---|---|---|---|
| Visual Studio | Windows | Полный функционал, лучшая официальная поддержка | Бесплатно для сообщества (взимаются другие сборы) | Корпоративные и полноценные разработчики |
| Visual Studio Code | Windows / Linux / macOS | Легкий и легко масштабируемый | бесплатно | Кроссплатформенные разработчики, студенты |
| JetBrains Rider | Windows / Linux / macOS | Интеграция ReSharper, кроссплатформенность | Требуется плата | Продвинутые разработчики и кроссплатформенные команды |
Ctrl + `)。dotnet new webapp -o MyAspNetApp
webapp: Создавайте веб-приложения ASP.NET Core с помощью Razor Pages.-o MyAspNetApp:Укажите имя папки проекта.cd MyAspNetApp
dotnet run
https://localhost:5001илиhttp://localhost:5000осуществлять.Файл → Открыть папку, загрузите вновь созданныйMyAspNetApp。dotnet добавить имя пакета
dotnet new webapp → Razor Pages Web Appdotnet new mvc→ Архитектура MVCdotnet new webapi→ Проект веб-APICtrl + Shift + P, введите и выберитеDebug: Open launch.json。.vscode/launch.json。{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (web)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/bin/Debug/net8.0/MyAspNetApp.dll",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/Views": "${workspaceFolder}/Views"
}
}
]
}
.vscodeГенерация папокtasks.json。{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/MyAspNetApp.csproj"
],
"problemMatcher": "$msCompile"
}
]
}
F5Или выберите на панели «Выполнение и отладка» слева..NET Core Launch (web)。https://localhost:5001。dotnet new webapi -o MyWebApiApp
cd MyWebApiApp
code .
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (web API)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/bin/Debug/net8.0/MyWebApiApp.dll",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/Views": "${workspaceFolder}/Views"
}
}
]
}
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/MyWebApiApp.csproj"
],
"problemMatcher": "$msCompile"
}
]
}
F5Или выберите на панели «Выполнение и отладка».NET Core Launch (web API)。https://localhost:5001илиhttp://localhost:5000。.httpили.restAPI тестирования архива.### Тест GET API
ПОЛУЧИТЬ https://localhost:5001/weatherforecast
Принять: приложение/json
###
### Пример тестового POST API
ПОСТ https://localhost:5001/api/sample
Тип контента: приложение/json
{
«идентификатор»: 1,
"name": "Тестовые данные"
}
test.http。Send Requestкнопка.Пустельга этоASP.NET CoreВстроенный кроссплатформенный веб-сервер, разработанный Microsoft. Он отличается высокой производительностью и легкостью, поддерживает HTTP/1.1 и HTTP/2 и является сервером по умолчанию для приложений ASP.NET Core. Использование Kestrel позволяет разработчикам напрямую обертывать веб-приложения каксамоупаковывающийся исполняемый файлвы можете запускать и предоставлять службы HTTP локально, не полагаясь на внешние серверы, такие как IIS, Apache или Nginx.
UseUrlsУстановите локальный порт и путь службы.public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseKestrel()
.UseUrls("http://localhost:5000");
var app = builder.Build();
app.MapGet("/", () => "Hello from Kestrel!");
app.Run();
}
}
dotnet publishУпакуйте приложение с помощью Kestrel в один исполняемый файл.| проект | Kestrel | IIS / Nginx |
|---|---|---|
| Будь то встроенный | Да (встроено в ASP.NET Core) | Нет (необходимо устанавливать отдельно) |
| Платформа поддержки | Windows / Linux / macOS | Зависит от сервера |
| Вам нужны права администратора? | нет | Зависит от платформы и настроек |
| Подходит ли он для самоинкапсуляции? | очень подходит | Не подходит |
| Производительность | высокий | Высокий (но настройка сложнее) |
ASP.NET Core поддерживает интеграцию внешних ресурсов (HTML, CSS, JavaScript, SPA и т. д.) и внутренних служб API в одно приложение и развертывание его в качестве независимого исполнительного блока (автономное приложение) для достижения целей простого развертывания, защиты исходного кода и контроля лицензий.
wwwroot/Папка для ASP.NET Core, которая будет служить статическими ресурсами.wwwroot/。wwwroot,Например:npm run buildпозжеdist/Скопировать вwwwroot/npm run buildпозжеbuild/Скопировать вwwwroot/Program.csСлужба статических файлов включена в:app.UseStaticFiles();
app.MapFallbackToFile("index.html");
dotnet publish -c Release -r win-x64 --self-contained
ASP.NET Core MVC — это кроссплатформенная среда веб-приложений, выпущенная Microsoft. Он основан на шаблоне проектирования Модель-Представление-Контроллер (модель-представление-контроллер) и обеспечивает структурированный и модульный способ разработки динамических веб-сайтов и веб-API.
// Модель
Продукт общественного класса
{
общественный ИНТ Id {получить; набор; }
общедоступная строка Имя {get; набор; }
общественная десятичная цена {get; набор; }
}
//Контроллер
общедоступный класс ProductsController: Контроллер
{
публичный индекс IActionResult()
{
var продукты = новый список<Продукт>
{
новый продукт { Id = 1, Name = "ноутбук", Price = 29999 },
новый товар { Id = 2, Name = «Мышь», Price = 499 },
новый продукт { Id = 3, Name = «Клавиатура», Price = 899 }
};
возврат просмотра(продукты);
}
}
// Просмотр (Index.cshtml)
@Model List<Product>
<table border="1" cellpadding="6" cellpacing="0">
<голова>
<tr>
<th>Номер</th>
<th>Имя</th>
<th>Цена</th>
</tr>
</голова>
<тело>
@foreach (элемент var в модели)
{
<tr>
<td>@item.Id</td>
<td>@item.Name</td>
<td>@item.Price.ToString("C")</td>
</tr>
}
</tbody>
</таблица>
<!-- Product.cs – Модель данных -->
Продукт общественного класса
{
общественный ИНТ Id {получить; набор; }
общедоступная строка Имя {get; набор; }
общественная десятичная цена {get; набор; }
}
<!-- ProductsController.cs — Контроллер (ASP.NET Core MVC) -->
общедоступный класс ProductsController: Контроллер
{
публичный индекс IActionResult()
{
var продукты = новый список<Продукт>
{
новый продукт { Id = 1, Name = "ноутбук", Price = 29999 },
новый товар { Id = 2, Name = "Мышь", Price = 499 },
новый продукт { Id = 3, Name = «Клавиатура», Price = 899 }
};
возврат просмотра(продукты);
}
}
<!-- Views/Products/Index.cshtml — страница просмотра Razor -->
@Model List<Product>
<table border="1" cellpadding="6" cellpacing="0">
<голова>
<tr>
<th>Номер</th>
<th>Имя</th>
<th>Цена</th>
</tr>
</голова>
<тело>
@foreach (элемент var в модели)
{
<tr>
<td>@item.Id</td>
<td>@item.Name</td>
<td>@item.Price.ToString("C")</td>
</tr>
}
</tbody>
</таблица>
Razor — это язык разметки, разработанный Microsoft для ASP.NET Core, который позволяет разработчикам встраивать код C# в HTML-страницы. Он сочетает в себе стандартные HTML и C#, что делает динамическое создание веб-страниц простым и интуитивно понятным.
@страница
@model ИндексМодель
<h1>Добро пожаловать на страницу Razor</h1>
<p>Сегодняшняя дата: @DateTime.Now.ToString("гггг-ММ-дд")</p>
@if(Model.Items != null && Model.Items.Any())
{
<ул>
@foreach (элемент var в Model.Items)
{
<li>@item</li>
}
</ul>
}
еще
{
<p>Данные не отображаются</p>
}
Использование в Razor View:
@foreach(var item in Model)
{
<div>@item</div>
}
Если возникает следующая ошибка:
System.NullReferenceException: Object reference not set to an instance of an object.
выражатьModelдляnull, что приводит к невозможности зацикливания.
public IActionResult Index()
{
var data = new List<string> { "A", "B", "C" };
return View(data);
}
@model IEnumerable<string>
@if (Модель!= ноль)
{
foreach (элемент var в модели)
{
<div>@item</div>
}
}
еще
{
<div>Нет данных</div>
}
Лучшая практикаУбедитесь, что модель должна иметь значение в контроллере.(даже пустую коллекцию), чтобы избежать обработки нулевых ситуаций просмотра. Например:
return View(data ?? new List<string>());
В ASP.NET Core MVC проект может иметь несколько контроллеров, каждый из которых отвечает за разные функции или области. Например:
HomeController— Обработка главной и статических страницProductController— Заниматься управлением продуктомКаждый контроллер должен наследоватьControllerкатегории и хранится вControllersпапка.
// Хоумконтроллер.cs
общедоступный класс HomeController: Контроллер
{
публичный индекс IActionResult()
{
вернуть просмотр();
}
}
//Продуктконтроллер.cs
открытый класс ProductController: Контроллер
{
общедоступный список IActionResult()
{
var Products = новый список<string> { "Компьютер", "Мобильный телефон", "Планшет" };
возврат просмотра(продукты);
}
}
Представление MVC по умолчанию создаст папки на основе имени контроллера, например:
Views/Home/Index.cshtmlViews/Product/List.cshtmlМожно использоватьasp-controllerиasp-actionПомощники тегов:
<a asp-controller="Home" asp-action="Index">Вернуться на домашнюю страницу</a>
<a asp-controller="Продукт" asp-action="List">Список продуктов</a>
существоватьProgram.csилиStartup.cs, маршрут по умолчанию обычно следующий:
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Это означает, что если URL-адрес/, будет автоматически направлятьHomeController.Index().
Если URL-адрес/Product/List, оно будет выполненоProductController.List()。
Вы можете иметь несколько контроллеров одновременно в MVC, если:
ControllerViewsСоздайте соответствующие папки и файлы вasp-controllerиasp-actionПравильный вызовModel(или составную модель представления), но может отображать или ссылаться на данные/действия от нескольких контроллеров на одной странице.// Модели/ViewModels.cs
публичный класс HomePageViewModel {
общедоступный IEnumerable<Product> Продукты {получить; набор; }
общедоступный IEnumerable<Order> RecentOrders {получить; набор; }
}
// Хоумконтроллер.cs
общественный индекс IActionResult () {
вар vm = новая HomePageViewModel {
Продукты = ProductService.GetTopProducts(),
RecentOrders = orderService.GetRecentOrders()
};
вернуть просмотр (ВМ);
}
// Просмотры/Home/Index.cshtml
@model
<h2>Продукт</h2>
@foreach(var p в Model.Products){ <div>@p.Name</div> }
<h2>Последние заказы</h2>
@foreach(var o in Model.RecentOrders){ <div>@o.Id</div> }
// Просмотры/Продукт/_ProductList.cshtml (частично)
@model IEnumerable<Product>
@foreach(var p в модели){ <div>@p.Name</div> }
// Views/Home/Index.cshtml (родительское представление)
@model
<див>
@Html.Partial("_ProductList", Model.Products)
</дел>
// Компоненты/ProductListViewComponent.cs
общественный класс ProductListViewComponent: ViewComponent {
частный только для чтения IProductService _svc;
общественный ProductListViewComponent (IProductService SVC) {_svc = SVC; }
public IViewComponentResult Invoke (число чисел) {
вар продукты = _svc.GetTopProducts(count);
возврат просмотра(продукты); // Представления/Общие/Компоненты/ProductList/Default.cshtml
}
}
// Используется в Razor
@await Component.InvokeAsync("ProductList", new { count = 5 })
<!-- Views/Home/Index.cshtml -->
<div id="product-area">Загрузка...</div>
<скрипт>
выборка('/api/product/top5')
.then(r => r.json())
.then(данные => {
document.getElementById('product-area').innerHTML =
data.map(p => `${p.name}`).join('');
});
</script>
<a asp-controller="Продукт" asp-action="List">Список продуктов</a>
<a asp-controller="Заказ" asp-action="История">История заказов</a>
ViewModelилиViewComponent(более модульный).Partial ViewилиViewComponent。Java-апплет — это небольшое приложение, написанное на языке Java, которое можно запустить через веб-браузер и встроить в HTML-страницу. Впервые он был широко использован в 1990-х годах для создания интерактивных веб-страниц, таких как анимация, игры и визуализация диаграмм.
Апплет должен выполняться в браузере, поддерживающем плагин Java, через<applet>или<object>Теги встроены в HTML, загружаются и выполняются пользовательской JVM (виртуальной машиной Java).
Поскольку апплеты могут выполняться на стороне клиента, чтобы предотвратить вредоносное поведение, среда выполнения использует «механизм песочницы» для изоляции безопасности, например, запрета доступа к локальной файловой системе или выполнения внешних программ.
Oracle объявила об удалении Applet API начиная с Java 9 и полностью отменит Applet в Java 11. Java Web Start, еще одна технология выполнения настольных компьютеров, также не обслуживается.
Java-апплеты вступили в фазу ликвидации, и современные тенденции веб-разработки имеют тенденцию использовать технологии открытых стандартов, такие как HTML5, JavaScript и WebAssembly. Разработчикам следует избегать использования апплетов и переносить существующие приложения на современные технологические платформы.
Ниже приведен пример Java-апплета, отображающего простое сообщение:
<!DOCTYPE html>
<html lang="zh-Hant">
<голова>
<мета-кодировка="UTF-8">
<title>Пример Java-апплета</title>
</голова>
<тело>
<h1>Пример Java-апплета</h1>
<applet code="HelloWorldApplet.class" width="300" height="300>
<param name="message" value="Привет, мир! ">
Ваш браузер не поддерживает Java-апплеты.
</апплет>
</тело>
</html>
import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorldApplet extends Applet {
String message;
public void init() {
message = getParameter("message");
}
public void paint(Graphics g) {
g.drawString(message, 20, 20);
}
}
1. Сохраните код Java какHelloWorldApplet.javaи выполните его в командной строкеjavac HelloWorldApplet.javaскомпилировать.
2. Убедитесь, что созданный.classФайл находится в том же каталоге, что и файл HTML.
3. Используйте среду, поддерживающую Java-апплеты, для выполнения HTML-файла.
Поскольку большинство современных браузеров больше не поддерживают апплеты Java, рекомендуется рассмотреть возможность использования других технологий (таких как JavaFX или веб-приложения) для достижения аналогичной функциональности.
email: [email protected]