js модуль порядка импорта и проблемы с выполнением

Я использую Vue и недавно столкнулся с проблемой.

если у меня есть два файла, файл A и файл B, а в файле B я пишу console.log('file B test')

когда я делаю

console.log('file A test') 
import B from '@/app/fileB'

-> the devTool shows file B's console.log first  

так в чем тут может быть проблема? порядок импорта? гарантируется ли импорт и выполнение сверху вниз? Если кто-то знает что-нибудь об импорте или выполнении заказа, сначала спасибо!!


person benson    schedule 13.05.2021    source источник


Ответы (1)


Операторы импорта всегда поднимаются на самый верх модуля. Модуль, который содержит

// some non-import code
import foo from 'foo';
// some more non-import code 2
import bar from 'bar';
// some more non-import code 3

будет работать так, как если бы весь импорт был в самом верху:

import foo from 'foo';
import bar from 'bar';

// some non-import code
// some more non-import code 2
// some more non-import code 3

Для того, что вы хотите сделать, у вас может быть метод init или что-то, что вы вызываете, чтобы заставить его делать свое дело:

import B from '@/app/fileB'
console.log('file A test')
B.init();

Другой вариант, который я предпочитаю, — это всегда импортировать и экспортировать функции — у вас может быть модуль makeB вместо B, а затем вызывать его в A:

// b
export const makeB = () => {
  const b = {};
  console.log('creating B now');
  // other stuff
  return b;
};
// a
import { makeB } from './makeB';
console.log('file A test');
const b = makeB();
// do stuff with b
person CertainPerformance    schedule 13.05.2021
comment
привет @CertainPerformance, спасибо за ответ. Итак, вы сказали, что операторы импорта всегда поднимаются на самый верх, что, если у меня есть несколько файлов импорта, и внутри каждого файла также есть несколько файлов импорта? весь импорт был сначала поднят наверх? потому что сейчас я поддерживаю проект и сталкиваюсь с проблемой упорядочения и пытаюсь понять, но порядок выполнения кода отличается от моего мышления. :( - person benson; 13.05.2021
comment
Да, все импорты для всех файлов будут подняты наверх — каждый файл будет загружен до фактического запуска любого из собственно JavaScript. Мое решение этой проблемы — всегда экспортировать функции и избегать побочных эффектов на верхнем уровне модулей. stackoverflow.com/a/52827581 stackoverflow.com /a/59998121 stackoverflow.com/a/63529657 - person CertainPerformance; 13.05.2021