Anonymous Quiz
8%
src
77%
href
13%
link
2%
ref
👍13😁7
Webpack — это мощный инструмент сборки модулей для современных JavaScript-приложений. Он используется для упаковки и оптимизации всех ресурсов вашего приложения, таких как JavaScript, CSS, изображения и другие файлы, в один или несколько файлов, которые можно эффективно загрузить в браузер.
:plu Webpack анализирует ваше приложение, начиная с одного или нескольких входных файлов (entry points), и строит граф зависимостей всех модулей, используемых в вашем приложении.
// webpack.config.js
module.exports = {
entry: './src/index.js',
};
// webpack.config.js
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
};
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
},
},
},
],
},
};
Webpack — это инструмент для сборки модулей, который объединяет и оптимизирует различные ресурсы приложения (JavaScript, CSS, изображения и т.д.) в один или несколько файлов для загрузки в браузер. Он использует входные точки (entry points), выходные точки (output), загрузчики (loaders) и плагины (plugins) для управления процессом сборки и обеспечения оптимальной производительности.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤6🔥2
Anonymous Quiz
9%
13%
.class
73%
[attribute=value]
4%
:first-child
👍11❤1
Передача строки непосредственно в DOM (Document Object Model) может привести к различным проблемам, связанным с безопасностью и корректностью рендеринга. Рассмотрим более подробно, почему это не рекомендуется.
<script> тег, который будет выполнен браузером и может украсть данные пользователей или выполнить другие вредоносные действия.const userInput = "<img src='x' onerror='alert(\"XSS Attack\")'>";
document.getElementById('output').innerHTML = userInput;
const invalidHTML = "<div>Unclosed tag";
document.getElementById('output').innerHTML = invalidHTML;
// Это может привести к неправильному отображению содержимого.
createElement, appendChild, textContent и другие. Эти методы позволяют безопасно добавлять элементы и текст в DOM.const userInput = "Safe text";
const outputElement = document.getElementById('output');
const textNode = document.createTextNode(userInput);
outputElement.appendChild(textNode);
const userInput = "<div>Safe content</div>";
const outputElement = document.getElementById('output');
outputElement.textContent = userInput;
// Использование textContent гарантирует безопасное добавление текста.
const userInput = "Some user-provided text";
const outputElement = document.getElementById('output');
outputElement.textContent = userInput;
const userInput = "Some user-provided text";
const outputElement = document.getElementById('output');
const paragraph = document.createElement('p');
paragraph.textContent = userInput;
outputElement.appendChild(paragraph);
Передача строки напрямую может быть небезопасной и привести к XSS-атакам и некорректному рендерингу. Вместо этого рекомендуется использовать методы DOM API, такие как
createElement, appendChild, и textContent, для безопасного и правильного добавления элементов и текста.Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Anonymous Quiz
14%
Специальные функции, возвращающие промисы
53%
Функции, позволяющие управлять итерацией
30%
Функции для создания прототипов объектов
3%
Механизм управления ошибками
👍13
Серверный рендеринг (Server-Side Rendering, SSR) и одностраничные приложения (Single Page Applications, SPA) — это два различных подхода к созданию веб-приложений, каждый из которых имеет свои преимущества и недостатки. Рассмотрим их основные отличия.
Некоторые современные фреймворки поддерживают гибридный подход, совмещая преимущества SSR и SPA. Например, Next.js для React позволяет рендерить начальную загрузку на сервере для улучшения SEO и времени до первого рендера, а затем переключаться на SPA для интерактивных взаимодействий.
SSR с Next.js (React):
// pages/index.js
import React from 'react';
const HomePage = ({ data }) => (
<div>
<h1>Home Page</h1>
<p>{data}</p>
</div>
);
export async function getServerSideProps() {
const res = await fetch('https://api.example.com/data');
const data = await res.json();
return {
props: { data },
};
}
export default HomePage;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26❤4
Anonymous Quiz
10%
!=
87%
!==
2%
<>
1%
^=
👍21😁5❤1
В разных языках программирования есть разные ключевые слова для объявления переменных. Два таких ключевых слова — const и let — широко используются. Рассмотрим различия между ними в контексте JavaScript.
Константные значения:
Инициализация: Переменная, объявленная с const, должна быть инициализирована сразу же при объявлении.
Область видимости: Имеет блочную область видимости, то есть видна только внутри блока {}, в котором объявлена.
const a = 10;
a = 20; // Ошибка: Assignment to constant variable.
const obj = { name: "John" };
obj.name = "Jane"; // Допустимо: изменяемое свойство объекта
console.log(obj.name); // "Jane"
Переменные, которые можно переназначить: Используется для объявления переменных, которые могут быть переназначены позже в коде.
Инициализация: Переменная, объявленная с let, не обязательно должна быть инициализирована при объявлении.
Область видимости: Также имеет блочную область видимости.
let b;
b = 10;
b = 20; // Допустимо: значение переменной изменено
console.log(b); // 20
if (true) {
let c = 30;
console.log(c); // 30
}
console.log(c); // Ошибка: c is not defined
Переназначение:
Инициализация:
Область видимости: Оба имеют блочную область видимости.
Использование const для неизменяемых переменных:
const pi = 3.14;
const maxItems = 100;
Использование let для переменных, значение которых будет изменяться:
let count = 0;
count++;
console.log(count); // 1
const используется для объявления переменных, которые не могут быть переназначены после их инициализации. Переменные, объявленные с const, должны быть инициализированы сразу и имеют блочную область видимости.let используется для объявления переменных, которые могут быть переназначены. Переменные, объявленные с let, могут быть не инициализированы сразу и также имеют блочную область видимости.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤9🤯1
Anonymous Quiz
8%
Функция, вызываемая в конце программы
74%
Функция, выполняемая немедленно после определения
7%
Функция, выполняемая при ошибке
11%
Функция для асинхронного выполнения
👍17
Передача функции по ссылке означает, что вы передаете не результат выполнения функции, а саму функцию как объект. Это позволяет вам вызывать эту функцию в другой части программы, возможно, в другом контексте или с другими аргументами. Рассмотрим более подробно, что это значит и какие возможности это предоставляет.
Определение функции: Вы создаете функцию и сохраняете ее в переменной или объявляете ее прямо в качестве аргумента.
function greet(name) {
return `Hello, ${name}!`;
}Передача функции по ссылке: Вы передаете функцию как аргумент другой функции или сохраняете ее в другой переменной.
function executeFunction(fn, arg) {
return fn(arg);
}
const result = executeFunction(greet, 'Alice');
console.log(result); // "Hello, Alice!"В этом примере функция
greet передается по ссылке в функцию executeFunction, которая затем вызывает greet с аргументом Alice.function add(x) {
return function(y) {
return x + y;
};
}
const addFive = add(5);
console.log(addFive(3)); // 8function fetchData(callback) {
setTimeout(() => {
const data = { name: 'Alice' };
callback(data);
}, 1000);
}
function handleData(data) {
console.log(`Received data: ${data.name}`);
}
fetchData(handleData);map, filter, reduce, принимают функции в качестве аргументов для обработки элементов массива.const numbers = [1, 2, 3, 4, 5];
const squared = numbers.map(num => num * num);
console.log(squared); // [1, 4, 9, 16, 25]
this) может измениться. Это особенно актуально для методов объектов.const person = {
name: 'Alice',
greet() {
console.log(`Hello, ${this.name}`);
}
};
const greet = person.greet;
greet(); // undefined, так как контекст потерян
const boundGreet = person.greet.bind(person);
boundGreet(); // Hello, Alicefunction createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24❤7🤯2
😁43👍5🤯1
Frontend — это термин, используемый для описания части веб-приложений и веб-сайтов, с которой взаимодействует пользователь. Это видимая и интерактивная часть приложения, отображаемая в браузере. Frontend включает в себя структуру, дизайн и поведение веб-страниц.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Пример страницы</title>
</head>
<body>
<h1>Заголовок страницы</h1>
<p>Это пример абзаца текста.</p>
</body>
</html>
body {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
margin: 0;
padding: 0;
}
h1 {
color: #333;
text-align: center;
}
p {
color: #666;
padding: 10px;
}Для упрощения разработки и улучшения эффективности существуют различные фреймворки и библиотеки, которые используются во фронтенд-разработке.
import React from 'react';
import ReactDOM from 'react-dom';
function App() {
return (
<div>
<h1>Привет, мир!</h1>
</div>
);
}
ReactDOM.render(<App />, document.getElementById('root'));
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤5🤔2
Anonymous Quiz
19%
Колбэк-функция
7%
Анонимная функция
66%
Рекурсивная функция
9%
Замыкание
👍14👀3❤2🎉1
CSS (Cascading Style Sheets) появился в середине 1990-х годов как стандарт для описания внешнего вида и форматирования веб-страниц. Разработка CSS началась как ответ на необходимость разделения содержимого веб-страниц и их оформления, что улучшило бы управляемость и поддерживаемость веб-контента. Рассмотрим подробнее историю и развитие CSS.
Ранние годы веб-разработки (1991-1994):
<b>, <i>, <font> и другие.Необходимость стандартизации (1994-1996):
Создание стандарта CSS (1996):
Развитие CSS (1998 - настоящее время):
CSS1 (1996):
CSS2 (1998):
CSS3 (начало 2000-х):
В CSS4 (официальной спецификации CSS4 как таковой нет, но многие новые возможности продолжают разрабатываться в рамках модулей CSS3) включены современные инструменты для веб-разработки, такие как переменные (CSS Custom Properties), сложные селекторы, улучшенная типографика и адаптивный дизайн.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Пример CSS</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header>
<h1>Заголовок страницы</h1>
</header>
<main>
<p>Это пример абзаца текста.</p>
</main>
<footer>
<p>© 2024 Все права защищены.</p>
</footer>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35😁4❤3
Anonymous Quiz
14%
"undefined"
32%
"number"
24%
"object"
30%
"NaN"
👍34
Redux — это библиотека для управления состоянием приложений, часто используемая с React, но она также может быть использована с другими библиотеками или фреймворками JavaScript. Redux предлагает централизованное хранилище (store) для состояния приложения, что делает управление состоянием более предсказуемым и удобным. Рассмотрим основные преимущества использования Redux:
Для начала установим необходимые пакеты:
npm install redux react-redux
Создание действий (actions)
// actions.js
export const increment = () => ({
type: 'INCREMENT',
});
export const decrement = () => ({
type: 'DECREMENT',
});
Создание редюсера (reducer)
// reducer.js
const initialState = {
count: 0,
};
const counterReducer = (state = initialState, action) => {
switch (action.type) {
case 'INCREMENT':
return {
...state,
count: state.count + 1,
};
case 'DECREMENT':
return {
...state,
count: state.count - 1,
};
default:
return state;
}
};
export default counterReducer;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤2🤯1
Anonymous Quiz
4%
continue
84%
break
11%
return
1%
exit
👍4❤1😁1
Redux работает по трем основным принципам: единое хранилище для всего состояния приложения, изменения в состоянии возможны только через отправку действий, и редукторы — чистые функции, определяющие, как действия изменяют состояние.
Все состояние приложения хранится в одном объекте хранилища (store). Это обеспечивает централизованное управление состоянием, что упрощает отладку и тестирование. В приложении должно быть только одно хранилище.
import { createStore } from 'redux';
import rootReducer from './reducers';
const store = createStore(rootReducer); Единственный способ изменить состояние — это отправить действие (action), описывающее изменение. Действия — это простые объекты, которые имеют свойство
type и, возможно, дополнительные данные. Изменения состояния должны происходить только через действия.const increment = () => ({
type: 'INCREMENT',
});
store.dispatch(increment());Для описания того, как действия изменяют состояние, используются редюсеры (reducers). Редюсеры — это чистые функции, которые принимают предыдущее состояние и действие в качестве аргументов и возвращают новое состояние. Редюсеры должны быть чистыми функциями и не должны иметь побочных эффектов.
const initialState = {
count: 0,
};
const counterReducer = (state = initialState, action) => {
switch (action.type) {
case 'INCREMENT':
return {
...state,
count: state.count + 1,
};
case 'DECREMENT':
return {
...state,
count: state.count - 1,
};
default:
return state;
}
};
const store = createStore(counterReducer);
Состояние в Redux должно быть неизменяемым. Вместо изменения текущего состояния, редюсеры должны возвращать новые объекты состояния. Используйте методы, которые не изменяют исходные объекты, такие как
Array.prototype.map, Array.prototype.filter, и оператор распространения (spread operator) для создания новых объектов и массивов.const newState = {
...state,
count: state.count + 1,
};Для упрощения отладки и поддержки инструментов разработки (например, Redux DevTools), действия и состояния должны быть сериализуемыми (не содержать циклических ссылок и неподдерживаемых типов данных, таких как функции или символы).
const action = {
type: 'ADD_TODO',
payload: {
id: 1,
text: 'Learn Redux',
},
};const initialState = {
todos: {
byId: {
1: { id: 1, text: 'Learn Redux' },
2: { id: 2, text: 'Build an app' },
},
allIds: [1, 2],
},
};Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤2
Anonymous Quiz
21%
Массив значений свойств объекта
73%
Массив имен свойств объекта
4%
Количество свойств объекта
2%
Новый объект с теми же свойствами
👍17
Чтобы изменить данные, нужно выполнить несколько шагов: создать действие (action), определить редюсер (reducer), который будет обрабатывать это действие и обновлять состояние, и затем отправить действие (dispatch action) в хранилище. Рассмотрим эти шаги более подробно.
Это объект, который описывает, что должно произойти. Он должен содержать как минимум свойство
type, которое указывает на тип действия. Дополнительно можно добавить любые данные, которые нужны для обновления состояния.// actions.js
export const increment = () => ({
type: 'INCREMENT',
});
export const decrement = () => ({
type: 'DECREMENT',
});
export const setValue = (value) => ({
type: 'SET_VALUE',
payload: value,
});
Это чистая функция, которая принимает текущее состояние и действие, а затем возвращает новое состояние. Редюсер должен быть чистой функцией, то есть не изменять переданные аргументы и не иметь побочных эффектов.
// reducer.js
const initialState = {
count: 0,
};
const counterReducer = (state = initialState, action) => {
switch (action.type) {
case 'INCREMENT':
return {
...state,
count: state.count + 1,
};
case 'DECREMENT':
return {
...state,
count: state.count - 1,
};
case 'SET_VALUE':
return {
...state,
count: action.payload,
};
default:
return state;
}
};
export default counterReducer;
createStore из библиотеки Redux. Хранилище объединяет редюсеры и обеспечивает централизованное управление состоянием.// store.js
import { createStore } from 'redux';
import counterReducer from './reducer';
const store = createStore(counterReducer);
export default store;
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import App from './App';
import store from './store';
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
useSelector и useDispatch из библиотеки react-redux.// App.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement, setValue } from './actions';
const App = () => {
const count = useSelector(state => state.count);
const dispatch = useDispatch();
return (
<div>
<h1>Counter: {count}</h1>
<button onClick={() => dispatch(increment())}>Increment</button>
<button onClick={() => dispatch(decrement())}>Decrement</button>
<button onClick={() => dispatch(setValue(10))}>Set to 10</button>
</div>
);
};
export default App;
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍29❤3