Задать вопрос
  • Почему не подключается Js скрипт?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    А Вы пробовали пройти Вашу строчку по шагам?
    app.use( // 5
      express.static( // 4
        path.join( // 3
          __dirname, // 1
          'public' // 2
    )))

    1. __dirname - Содержит абсолютный путь до папки с файлом в котором выполняется (для примера пусть будет '/path/to/project')
    2. 'public' - просто строчка
    3. соединяем (1) и (2) как путь, получим '/path/to/project/public'
    4. express.static - принимает путь из (3) и создает функцию которая обрабатывает запросы и ищет им соответствие в виде файлов в указанной папке
    5. app.use - просто подключает функцию из (4) к движку express'а, без каких либо фильтров, то есть функция static обработает абсолютно все запросы которые дойдут до нее

    Теперь смотрим на шаблон, в нем прописан скрипт public/reglog.js
    Это относительный путь, то есть он автоматом соединится с путем от куда вызван
    то есть если main.hbs отрисуется в условный site.com/index.html - то скрипт запросится из
    а если main.hbs отрисуется в условный site.com/some/nested/index.html - то скрипт запросится из site.com/some/nested/public/reglog.js

    Теперь представьте, в функцию 4 попадает запрос /some/nested/public/reglog.js
    она соединяет ее с путем из (3) и получает путь /path/to/project/public/some/nested/public/reglog.js
    потом смотрит его на диске и естественно ничего не находит, ставит в express response статус 404 и отдает управление дальше в express

    для ленивых, которым готовый суп, а не разобраться почему
    <script src="/reglog.js"></script>
    Ответ написан
    1 комментарий
  • Как установить зависимости с прошлого проекта в новый package.json?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    npm i это короткий вариант npm install
    Без параметров он устанавливает зависимости из package.json и если есть файл package-lock.json, то нормализует папку node_modules по нему.
    npm i nameустановит пакет name версии отмеченной тегом latest (тэг по умолчанию)
    npm i name@tagустановит пакет name версии отмеченной тегом tag
    npm i name@5установит пакет name версии 5.x.x где x.x - последний из 5
    npm i name@5.3установит пакет name версии 5.3.x где x - последний из 5.3
    npm i name@5.3.1установит пакет name версии 5.3.1
    параметр --save или его короткий вариант -S сохранит зависимость в package.json в секции dependencies, с некоторых пор это поведение по умолчанию при наличии package.json
    параметр --save-dev или его короткий вариант -D сохранит зависимость в package.json в секции devDependencies

    А как устанавливать в Вашем конкретном случае можете решить только Вы.
    Ответ написан
    Комментировать
  • Почему ветвление if-else срабатывает не правильно?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Потому что у Вас блок else срабатывает на каждой итерации цикла
    тык
    Ответ написан
    2 комментария
  • Почему выводит NaN?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Потому что Вы значения получаете тогда, когда поля еще пустые, а по нажатию кнопки просто их используете, нужно получать по нажатию кнопки, кроме того сам input не парсится в int, нужно парсить его свойство value:
    var input1 = document.getElementById("input1");
    var input2 = document.getElementById("input2");
    var button = document.getElementById("button");
    
    button.onclick = function(){
        var result = parseInt(input1.value) + parseInt(input2.value);
        document.body.append(result);
    }
    Ответ написан
    1 комментарий
  • Дублируются ли npm модули?

    bingo347
    @bingo347
    Crazy on performance...
    Собираю проект при помощи Gulp
    Gulp ничего собирать не может, так как Gulp - это task runner (запускатель задач если по-русски), собирать может то, что Gulp запускает, например bundler (сборщик) вроде Webpack или Rollup или просто конкатенатор файлов.
    Если я подключаю один и тот же модуль npm, к примеру JQuery, к разным файлам, а потом эти файлы подключаю к main.js - будут ли модули из npm дублироваться?
    зависит от того, чем все таки собираете, если обычная конкатенация файлов - то да, будет дублирование. А если Webpack или Rollup - нет.
    Ответ написан
  • Можно ли считать JavaScript полноценным языком программирования?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Может у него было тяжелое начало, но сейчас, можно ли его считать полноценным?
    JS тьюринг полный язык и всегда им был. Тьюринг полнота означает, что на нем можно посчитать все что в принципе вычислимо.

    Просто в нем даже импорт файла нормально нельзя сделать (даже в css он есть хоть и не полный)...
    Уже 5 лет как можно, в отличии, например, от C, где отдельные модули до сих пор нужно линковщиком собирать после компиляции. Так что, по Вашему C тоже не полноценный теперь?

    Нету многих приколов, фишек и функций, хотя я понимаю что внедрять их поздно, и для браузера он создавался.
    Хотелось бы конкретики, каких таких "приколов" Вам не хватает? Вот тут ребята открыты к предложениям: https://github.com/tc39/ecma262/blob/master/CONTRI...
    Ответ написан
    Комментировать
  • Как отправить данные из бекенда на фронтенд?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Ответ написан
    Комментировать
  • Можно достать данные из корневого тэга?

    bingo347
    @bingo347
    Crazy on performance...
    Vue полностью заменяет элемент, на котором его инициализируют, читайте данные через обычный DOM api до инициализации vue
    Ответ написан
  • Реакция в 00:00, как сделать?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    function cloneOrCreateDate(date) {
      return date instanceof Date ? new Date(date) : new Date();
    }
    function getMidnightDate(date) {
      const d = cloneOrCreateDate(date);
      d.setHours(0);
      d.setMinutes(0);
      d.setSeconds(0);
      d.setMilliseconds(0);
      return d;
    }
    
    function addDaysToDate(days, date) {
      const d = cloneOrCreateDate(date);
      d.setDate(d.getDate() + days);
      return d;
    }
    
    function timeOffset(d1, d2) {
      return Math.abs(d1 - d2);
    }
    
    setTimeout(() => {
      // логика в полночь
    }, timeOffset(Date.now(), addDaysToDate(1, getMidnightDate())));
    Ответ написан
    3 комментария
  • Почему не работают функции на js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вы считали значения с полей 1 раз на старте программы, а нужно читать на каждое нажатие кнопки
    Ответ написан
    2 комментария
  • Как поменять формат даты в moment.js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const date = '25.10.2020';
    const reformatedDate = moment(date, 'DD.MM.YYYY').format('YYYY-MM-DD');
    Ответ написан
    Комментировать
  • Почему есть разница в названиях свойств объекта Promise?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Потому-что это не свойства, это лишь вьюшки для консоли на внутреннее состояние встроенного в движок JS объекта.
    Каждая реализация вольна называть их по своему, либо вообще не показывать.
    Ответ написан
    Комментировать
  • Зачем нужны Module и Namespace?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    TypeScript появился еще до того, как в JavaScript, на котором он основан, появились какие либо модули, не то что нативные, даже эмуляций вроде commonjs или amd тогда еще не было. В те времена было в норме просто обернуть содержимое файла в замыкание, а потом либо просто подгрузить все файлы через тэг script либо просто соединить эти файлы в один. Наружу же высвечивалась одна единственная переменная, содержащая все публичное апи такого модуля, ее ложили или в глобальный объект или в другую такую-же переменную.
    Конструкции module и namespace позволяют упростить создание таких переменных, избавив разработчика от написания однотипного кода. В этом плане они по сути делают одно и то же.
    Сейчас это не рекомендованное использование, и стандартный плагин typescript к eslint с настройками по умолчанию запрещает эти конструкции.

    Второе применение - это файлы деклараций.
    namespace позволяет объявить объект, но несколько особенный в рамках типизации, он может содержать в себе любые сущности языка и экспортировать не которые из них, в том числе типы, что недоступно для декларации обычного объектного типа.
    declare namespace XXX {
      // по сути просто поле XXX.a
      let a: number;
      // то же поле XXX.b но уже const
      // современный ts позволяет делать поля readonly, но раньше так было нельзя
      const b: number;
      // функция, по сути метод XXX.c()
      function c(): void;
      // а вот вложенный тип через тип объекта не объявить, а в namespace можно
      type T = number | string;
    }

    module позволяют объявить виртуальные модули, о типах которых typescript не знает, например потому что они генерируются сборщиками вроде webpack. Яркий пример тут это css-модули или картинки, которые можно импортировать благодаря webpack, но typescript ничего не знает о их типах, поэтому нужно объявить их в глобальных декларациях:
    declare module '*.png' {
      const url: string;
      export default url;
    }
    declare module '*.css' {
      const classNames: Record<string, string>;
      export default classNames;
    }
    Ответ написан
    1 комментарий
  • Как правильно прописать тип number|null?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Интерфейс в TypeScript может иметь несколько объявлений в коде, и TypeScript объединит их все в один общий тип. Судя по ошибке с Вашим ApplicationInit именно это произошло, помимо поля initialPayment объявлены другие поля в другом объявлении, поэтому он их и требует.
    Ответ написан
    Комментировать
  • Как развернуть юнион в интерфейс?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    type Union = 'a' | 'b' | 'c';
    type Obj = {
      [K in Union]: any;
    };
    Интерфейсом насколько помню так нельзя
    Ответ написан
  • Что означает этот синтаксис?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Очень похоже на код сжатый через terser.js или что-то подобное.
    Если развернуть немного, то получится вот так:
    let a;
    t >>>= 0;
    if(t < 128) a = 1;
    else if(t < 16384) a = 2;
    else if(t < 2097152) a = 3;
    else if(t < 268435456) a = 4;
    else a = 5;
    this.tail.next = new f(a, t);
    this.tail = this.tail.next;
    this.len += this.tail.len;
    return this;

    Ну а на оператор запятая Вадим уже дал ссылку
    Ответ написан
    Комментировать
  • Нужен ли TypeScript для написания бэкенда на Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Можно ли обойтись обычным js?
    Можно. TypeScript лишь добавляет к JavaScript статическую типизацию в компайл-тайм. После компиляции будет все тот же JS.

    Какие будут плюсы?
    Главный плюс, ИМХО, - скорость разработки за счет подсказок IDE и автодополнения, больше авторефакторингов. Ну и возможность ограничить использование функций/методов от нежелательного использования тоже плюс. А если еще и проектировать доменную модель на типах, то можно сразу видеть, если что-то не сходится, еще до написания логики.

    Не будет ли много лишней писанины по сравнению с чистым js?
    Большинство типов TypeScript способен вывести. Далеко не Хиндли-Милнер конечно, но тоже хорошо. Я пишу больше в ФП стиле, с редкой примесью структурно-процедурного при описании эффектов, так у меня явные указания типов присутствуют только в сигнатурах функций. В самой логике код неотличим от обычного JS, но с хорошей проверкой типов.

    Будет ли сложно хранить скомпилированный js?
    Как и любые другие артефакты сборки, скомпилированный JS хранить не нужно. Компилируйте непосредственно перед выкладыванием на продакшен, а в git храните лишь TS код + настройки компилятора. А в dev среде вообще можно запускаться через модуль ts-node.
    Ответ написан
    Комментировать
  • Проверка значений массива?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    type Validator<U extends string, A extends ReadonlyArray<string>> =
      (U extends A[number] ? true : false) extends true ? A : never;
      
    type U = 'foo' | 'bar';
    const arr0 = ['foo'] as const;
    const arr1 = ['bar'] as const;
    const arr2 = ['foo', 'bar'] as const;
    
    type A0 = Validator<U, typeof arr0>; // never
    type A1 = Validator<U, typeof arr1>; // never
    type A2 = Validator<U, typeof arr2>; // readonly ['foo', 'bar']
    
    const _check0: A0 = arr0; // error
    const _check1: A1 = arr1; // error
    const _check2: A2 = arr2;

    https://www.typescriptlang.org/play?#code/C4TwDgpg...
    Ответ написан
    Комментировать
  • Как забрать данные из промиса?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Нет, это не промис, это асинхронная функция, которая отдает свой результат в колбэк, как правило такая функция ничего не возвращает, а значит и await'ить нечего, так как await требует метод then у результата выражения справа.
    Но можно это обернуть в промис:
    async function checkUser(login, password) {
        const ad = new ActiveDirectory(ad_config)
        const auth = await new Promise((resolve, reject) => {
            ad.authenticate(login, password, (err, auth) => {
                if (err) {
                    return reject(err)
                }
                resolve(auth)
            })
        })
        return auth
    }
    Ответ написан
    1 комментарий