2. css tree shaking

CSS Tree Shaking in Webpack
本文介绍了如何在Webpack中实现CSS的打包压缩、单独抽离以及Tree Shaking。使用css-loader加载并解析CSS文件,style-loader将CSS插入HTML中。通过mini-css-extract-plugin可以将CSS抽离到单独文件。为了进行CSS Tree Shaking,可以使用purifycss-webpack来移除未使用的样式。若涉及JS操作DOM,可能需要额外配置。

1.打包压缩css文件

css-loader: 加载解析文件,如遇到@import会将相应的样式文件引入(如没有css-loader则不会引入该文件)

style-loader:将解析的css放style标签,插入head标签里

(css样式打包到main.js文件里)

实例:

/* demo.css*/
body{
    background: #ccc;
}

div{
    height: 200px;
    width: 200px;
    background: tomato;
}

p{
    font-size: 50px;
    font-weight: 800;
}

a{
    color: green;
}
//index.js
import './demo.css';

//webpack.config.js
module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader','css-loader']
            }
        ]
    }
}
<!-- index.html -->
    <div></div>
    <script src="./dist/main.js"></script>

 

2.单独抽离出css文件

mini-css-extract-plugin:将css抽离到单独的文件中

安装 npm install mini-css-extract-plugin --save-dev

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [MiniCssExtractPlugin.loader,'css-loader']
            }
        ]
    },
    plugins: [
        new MiniCssExtractPlugin()
    ]
}

 

3.css-tree-shaking

purifycss-webpack:移除没有使用到css样式

安装 npm install purifycss-webpack purifycss --save-dev

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const PurifyCSSPlugin = require('purifycss-webpack');
const path = require('path');
const glob = require('glob')

module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [MiniCssExtractPlugin.loader,'css-loader']
            }
        ]
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: '[name].css'
        }),
        new PurifyCSSPlugin({
            paths: glob.sync(path.join(__dirname, './*.html'))
        })
    ]
}

另:若在js文件中操作dom元素,则需另外配置,如

安装glob-all

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const PurifyCSSPlugin = require('purifycss-webpack');
const path = require('path');
const glob = require('glob-all');  

module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [MiniCssExtractPlugin.loader, 'css-loader']
            }
        ]
    },
    plugins: [
        new MiniCssExtractPlugin({
            filename: '[name].css'
        }),
        new PurifyCSSPlugin({
            paths:
                glob.sync([
                    path.join(__dirname, './*.html'),
                    path.join(__dirname, './src/*.js')])
        })
    ]
}

 

<think>好的,我需要帮助用户了解在Vue2中如何实现Tree Shaking来优化代码。首先,用户可能已经知道Vue3原生支持Tree Shaking,但Vue2本身并不直接支持,所以需要找到变通方法。 根据引用中的信息,Vue3通过ES模块和架构调整实现了更好的Tree Shaking。而Vue2的模块系统主要是CommonJS,这可能限制了静态分析。因此,我需要考虑如何让打包工具如Webpack识别Vue2中的未使用代码。 引用[2]提到第三方库需要适配Tree Shaking,所以可能需要检查使用的Vue2组件库是否支持按需导入。例如,Element UI可能需要使用babel-plugin-component来按需加载组件,而不是整个库。 引用[4]中提到的/*#__PURE__*/注释可能对Vue2有用,因为Rollup和Webpack可以识别这些注释来标记无副作用的代码,从而安全地删除未使用的部分。可能需要在Vue2的代码中手动添加这些注释,或者通过插件自动处理。 另外,引用[5]中的unplugin-vue-components示例虽然针对Vue3和Vite,但类似工具可能适用于Vue2,比如使用babel插件或Webpack插件来自动按需引入组件,减少打包体积。 接下来,我需要整理步骤:首先配置打包工具支持ES模块,然后按需引入Vue组件,使用PURE注释,最后优化构建配置。同时,要注意可能遇到的副作用问题,比如未正确标记导致必要代码被删除,这时候需要调整配置或手动排除。 需要验证这些步骤的有效性,并确保示例代码正确,比如Webpack的配置和Babel插件的使用。可能还需要提到测试和构建分析工具,如Webpack Bundle Analyzer,来验证Tree Shaking的效果。 最后,要提醒用户Vue2Tree Shaking效果有限,建议升级到Vue3以获得更好的优化。同时,总结常见问题,如模块格式、副作用处理和第三方库支持,帮助用户避免常见陷阱。</think>在Vue2中实现Tree Shaking需要结合模块化打包工具和特定配置策略,以下是具体操作指南: ### 一、Vue2实现Tree Shaking的核心原理 Vue2默认采用CommonJS模块规范,需通过Webpack的`sideEffects`配置实现近似Tree Shaking效果[^2]。其本质是通过静态代码分析识别未使用的export代码块,结合ESM模块规范实现按需加载[^4]。 ### 二、Webpack配置步骤 1. **启用ES模块解析** ```javascript // webpack.config.js module.exports = { resolve: { mainFields: ['module', 'main'] // 优先解析ES模块 } } ``` 2. **标记无副作用模块** ```javascript // package.json { "sideEffects": [ "*.css", "*.scss", "**/*.vue" // 声明Vue单文件组件的副作用 ] } ``` 3. **优化生产构建** ```javascript optimization: { usedExports: true, minimize: true, minimizer: [new TerserPlugin()] } ``` ### 三、Vue组件按需加载方案 对于ElementUI等第三方库: ```javascript // babel.config.js plugins: [ [ "component", { "libraryName": "element-ui", "styleLibraryName": "theme-chalk" } ] ] ``` ### 四、代码层优化技巧 1. **函数级Tree Shaking** ```javascript /*#__PURE__*/ export const unusedUtil = () => { ... } // 标记可删除代码[^4] ``` 2. **动态导入非核心功能** ```javascript Vue.component('heavy-module', () => import('./HeavyComponent.vue')) ``` ### 五、验证与调试 1. 使用`webpack-bundle-analyzer`分析产物 2. 检查构建日志中的`unused harmony export`提示 ### 六、Vue2特有注意事项 1. **Vue全局API处理** ```javascript // 避免全局注册 // ❌ Vue.use(VueRouter) const router = new VueRouter({...}) // ✅ 按需实例化 ``` 2. **模板编译优化** ```javascript new Vue({ compiler: new VueTemplateCompiler({ preserveWhitespace: false }) }) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值