-
Notifications
You must be signed in to change notification settings - Fork 919
webpack 4 tree-shaking sideEffects: false removes styles for single-file vue components in production builds #1435
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Check webpack/webpack#6741 |
@posva : Thanks for the reference. For clarity, it would impact both library authors and monorepo projects. Updating the docs for vue-loader would probably be sufficient to close this out. |
Yes, it doesn't just affect library authors. We have a monorepo for our app and Removing So this should definitely be documented somewhere e.g. here. |
An important update. As of now, I need to use
in You can try it by running Webpack in Development mode, with |
So weirdly, this works. Essentially it's an instruction to the vue-loader to import and use the style from the same file (recursively). The resulting value of style is {}, but it tricks webpack into thinking the style in this file is not a side-effect. -- file: Palette.vue ---
I'm NOT suggesting this as a solution, but would it be possible to append a similar import to the front of the script section automatically in the vue-loader, thereby making the style mandatory . |
@gombosg 's solution is what made my day. This is not documented anywhere. Our build was not tree shaking until we added the |
I have my own set of UI components and a file re-exporting those components, so I can spare a few keystrokes, i.e.
And I struggled to exclude unused Vue modules without excluding the styles of the used ones until I came across @thelonecabbage's answer (#1435 (comment)) and I'm sincerely thankful for giving me an idea of how the tree-shaking can finally be fixed in my project: {
module: {
rules: [{
test: /\.vue$/,
sideEffects: false
}, {
test: /\.vue$/,
resourceQuery: /type=style/,
sideEffects: true
}]
}
} |
See discussions at vuejs/vue-loader#1435
See discussions at vuejs/vue-loader#1435
Version
15.4.0
Reproduction link
https://github.com/WireWheel/style-tree-shaking-bug
Steps to reproduce
Pull down the repo.
npx lerna bootstrap --hoist
npm run build
Take a look in
dist/css/index.[hash].css
and notice that the styles inpackages/one/components/HelloWorld.vue
are not in the extracted css file.sideEffects: true
inpackages/one/package.json
npm run build
Styles are now included in the
dist/css/index.[hash].css
.What is expected?
styles are not removed for components included in the bundle.
What is actually happening?
styles are omitted from the bundled css.
The solution here could be to say that you cannot use
sideEffects: false
as a valid setting for any package that includes single-file Vue components. If so, it'd might be sufficient to document that. It'd be great if tree shaking could still be used in this setup without losing the styles.The key components here are:
sideEffects: false
in the package.jsonI'm opening this against vue-loader since it seems appropriate for the vue-ecosystem—but things at play are webpack, vue-loader, css-loader, etc.
The text was updated successfully, but these errors were encountered: