'f'
mh-two-thousand-and-two
2024-04-12 26f2711ef9461961fb953e2b497bd314ef95e345
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
const t = require('@babel/types')
const babelTemplate = require('@babel/template').default
 
// const buildDynamicImport = babelTemplate(`var IMPORT_NAME = ()=>import(IMPORT_SOURCE)`, {
//   preserveComments: true,
//   plugins: [
//     'dynamicImport'
//   ]
// })
// 已废弃,@vue/cli-plugin-babel@4 增加了 dynamic import 转换
// var test = ()=>import(/* webpackChunkName: "components/test" */'../../components/test')
// function getDynamicImport (name, source, chunkName) {
//   const stringLiteral = t.stringLiteral(source)
//   const dynamicImportComment = {
//     type: 'CommentBlock',
//     value: `webpackChunkName: "${chunkName}"`
//   }
//   stringLiteral.leadingComments = [dynamicImportComment]
//   return buildDynamicImport({
//     IMPORT_NAME: t.identifier(name),
//     IMPORT_SOURCE: stringLiteral
//   })
// }
// var test = function(resolve) {require.ensure([], () => resolve(require('../../components/test')),'components/test')}
const buildRequireEnsure = babelTemplate(
  'var IMPORT_NAME = function(){require.ensure([],()=>resolve(require(IMPORT_SOURCE)),CHUNK_NAME)}'
)
 
function getRequireEnsure (name, source, chunkName) {
  return buildRequireEnsure({
    IMPORT_NAME: t.identifier(name),
    IMPORT_SOURCE: t.stringLiteral(source),
    CHUNK_NAME: t.stringLiteral(chunkName)
  })
}
 
module.exports = function ({
  types: t
}) {
  return {
    visitor: {
      ImportDeclaration (path, state) {
        const dynamicImport = state.opts.dynamicImports[path.node.source.value]
        if (dynamicImport) {
          path.insertBefore(
            getRequireEnsure(
              path.node.specifiers[0].local.name,
              dynamicImport.source,
              dynamicImport.chunkName
            )
          )
          path.remove()
        }
      }
    }
  }
}