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()
|
}
|
}
|
}
|
}
|
}
|