Skip to content

Commit e974933

Browse files
committed
fix(babel-plugin): fix chunkName with aggressive code splitting
Closes #182
1 parent 6b94cfb commit e974933

File tree

4 files changed

+113
-11
lines changed

4 files changed

+113
-11
lines changed

examples/server-side-rendering/src/client/App.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const A = loadable(() => import('./letters/A'))
77
const B = loadable(() => import('./letters/B'))
88
const C = loadable(() => import(/* webpackPreload: true */ './letters/C'))
99
const D = loadable(() => import(/* webpackPrefetch: true */ './letters/D'))
10+
const X = loadable(props => import(`./letters/${props.letter}`))
1011

1112
// We keep some references to prevent uglify remove
1213
A.C = C
@@ -18,6 +19,7 @@ const App = () => (
1819
<div>
1920
<A />
2021
<B />
22+
<X letter="A" />
2123
<Moment>{moment => moment().format('HH:mm')}</Moment>
2224
</div>
2325
)

packages/babel-plugin/src/__snapshots__/index.test.js.snap

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,91 @@ exports[`plugin aggressive import with "webpackChunkName" should replace it 1`]
8484
});"
8585
`;
8686
87-
exports[`plugin aggressive import without "webpackChunkName" should add it 1`] = `
87+
exports[`plugin aggressive import without "webpackChunkName" should support complex request 1`] = `
88+
"loadable({
89+
chunkName(props) {
90+
return \`dir-\${props.foo}-test\`;
91+
},
92+
93+
isReady(props) {
94+
if (typeof __webpack_modules__ !== 'undefined') {
95+
return !!__webpack_modules__[this.resolve(props)];
96+
}
97+
98+
return false;
99+
},
100+
101+
requireAsync: props => import(
102+
/* webpackChunkName: \\"dir-[request]-test\\" */
103+
\`./dir/\${props.foo}/test\`),
104+
105+
requireSync(props) {
106+
const id = this.resolve(props);
107+
108+
if (typeof __webpack_require__ !== 'undefined') {
109+
return __webpack_require__(id);
110+
}
111+
112+
return eval('module.require')(id);
113+
},
114+
115+
resolve(props) {
116+
if (require.resolveWeak) {
117+
return require.resolveWeak(\`./dir/\${props.foo}/test\`);
118+
}
119+
120+
return require('path').resolve(__dirname, \`./dir/\${props.foo}/test\`);
121+
}
122+
123+
});"
124+
`;
125+
126+
exports[`plugin aggressive import without "webpackChunkName" should support destructuring 1`] = `
127+
"loadable({
128+
chunkName({
129+
foo
130+
}) {
131+
return \`dir-\${foo}-test\`;
132+
},
133+
134+
isReady(props) {
135+
if (typeof __webpack_modules__ !== 'undefined') {
136+
return !!__webpack_modules__[this.resolve(props)];
137+
}
138+
139+
return false;
140+
},
141+
142+
requireAsync: ({
143+
foo
144+
}) => import(
145+
/* webpackChunkName: \\"dir-[request]-test\\" */
146+
\`./dir/\${foo}/test\`),
147+
148+
requireSync(props) {
149+
const id = this.resolve(props);
150+
151+
if (typeof __webpack_require__ !== 'undefined') {
152+
return __webpack_require__(id);
153+
}
154+
155+
return eval('module.require')(id);
156+
},
157+
158+
resolve({
159+
foo
160+
}) {
161+
if (require.resolveWeak) {
162+
return require.resolveWeak(\`./dir/\${foo}/test\`);
163+
}
164+
165+
return require('path').resolve(__dirname, \`./dir/\${foo}/test\`);
166+
}
167+
168+
});"
169+
`;
170+
171+
exports[`plugin aggressive import without "webpackChunkName" should support simple request 1`] = `
88172
"loadable({
89173
chunkName(props) {
90174
return \`\${props.foo}\`;

packages/babel-plugin/src/index.test.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,29 @@ describe('plugin', () => {
8787
})
8888

8989
describe('without "webpackChunkName"', () => {
90-
it('should add it', () => {
90+
it('should support simple request', () => {
9191
const result = testPlugin(`
9292
loadable(props => import(\`./\${props.foo}\`))
9393
`)
9494

9595
expect(result).toMatchSnapshot()
9696
})
97+
98+
it('should support complex request', () => {
99+
const result = testPlugin(`
100+
loadable(props => import(\`./dir/\${props.foo}/test\`))
101+
`)
102+
103+
expect(result).toMatchSnapshot()
104+
})
105+
106+
it('should support destructuring', () => {
107+
const result = testPlugin(`
108+
loadable(({ foo }) => import(\`./dir/\${foo}/test\`))
109+
`)
110+
111+
expect(result).toMatchSnapshot()
112+
})
97113
})
98114
})
99115

packages/babel-plugin/src/properties/chunkName.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,17 @@ export default function chunkNameProperty({ types: t }) {
9898
chunkNameComment.remove()
9999
}
100100

101-
if (isAgressiveImport(callPath)) {
102-
values.webpackChunkName = '[request]'
103-
}
104-
105-
// const value = t.isTemplateLiteral(chunkName)
106-
// ? chunkName.quasis[0].value.cooked
107-
// : chunkName.value
108-
109101
importArg.addComment('leading', writeWebpackCommentValues(values))
110102
}
111103

104+
function chunkNameFromTemplateLiteral(node) {
105+
const [q1, q2] = node.quasis
106+
const v1 = q1 ? q1.value.cooked : ''
107+
const v2 = q2 ? q2.value.cooked : ''
108+
if (!node.expressions.length) return v1
109+
return `${v1}[request]${v2}`
110+
}
111+
112112
function replaceChunkName(callPath) {
113113
const agressiveImport = isAgressiveImport(callPath)
114114
const values = getExistingChunkNameComment(callPath)
@@ -120,7 +120,7 @@ export default function chunkNameProperty({ types: t }) {
120120

121121
const chunkNameNode = generateChunkNameNode(callPath)
122122
const webpackChunkName = t.isTemplateLiteral(chunkNameNode)
123-
? chunkNameNode.quasis[0].value.cooked
123+
? chunkNameFromTemplateLiteral(chunkNameNode)
124124
: chunkNameNode.value
125125
addOrReplaceChunkNameComment(callPath, { webpackChunkName })
126126
return chunkNameNode

0 commit comments

Comments
 (0)