ImportDeclaration()

in packages/babel-plugin-transform-loadable-component/src/index.js [18:58]


    ImportDeclaration(p) {
      const specifiers = p.get('specifiers')
      const source = p.get('source')

      if (
        // 如果没有 specifier, 如 import 'module' 则直接略过该次遍历
        !specifiers ||
        !specifiers.length ||
        // 如果 source 非法则直接略过该次遍历
        !source ||
        !source.isStringLiteral()
      ) {
        return
      }

      // 目前只解析 default import 标识, 如果未发现 default import 特征, 则直接略过该次遍历
      const firstSpecifier = specifiers[0]
      if (!firstSpecifier || !firstSpecifier.isImportDefaultSpecifier()) {
        return
      }

      // 获得当前的 default import 标识
      const defaultImportIdentifier = firstSpecifier.get('local').node.name
      const importSource = source.node.value
      const importDeclarationMap = {
        source: importSource,
        path: p,
      }

      if (importSource === defaultReactLoadableSource) {
        // 如果找到了 react-loadable 的 import 引用, 则记录下来避免误删
        // 并在后续的转换过程直接使用该 identifier 作为引用值
        this.reactLoadableImport.set('path', p)
        this.reactLoadableImport.set('identifier', defaultImportIdentifier)
      } else {
        this.defaultImportsMap.set(
          defaultImportIdentifier,
          importDeclarationMap
        )
      }
    },