# webpack-learn-demo **Repository Path**: zero_fsc/webpack-learn-demo ## Basic Information - **Project Name**: webpack-learn-demo - **Description**: 基于webpack5的模块化学习demo - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-20 - **Last Updated**: 2022-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### webpack工作原理 - 输入:从文件系统读入代码文件。 - 模块递归处理:调用**Loader**转义Module内容,并将结果转换为AST,从中分析出模块依赖关系,进一步递归调用模块处理过程,直到所有依赖文件都处理完毕。 - 后处理:所有模块递归处理完毕后开始执行后处理。包括【模块合并、注入运行时、产物优化等】,最终稿输出Chunk集合。 - 输出:将Chunk写出到外部文件系统。 ### 打包流程 - 根据输入配置【entry/context】找到项目入口文件 - 根据按模块处理【module/resolve/externals等】做配置的规则主意处理模块文件,处理过程包括转译、依赖分析等。 - 模块处理完毕后,最后再根据后处理相关配置项【optimization/target等】合并模块资源、注入运行时依赖、优化产物结构等。 ![image-20220829143840369](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220829143840369.png) ### Loader #### JavaScript&TypeScript ```javascript { test: /\.js$/, // 用于声明该规则的过滤条件,只有路径名命中该正则的文件才会应用这条规则。 use: ['babel-loader'] // 用于声明这条规则的Loader处理器序列,所有命中该规则的文件都会被传入Loader序列做转义处理。 } // TypeScript ts-loader { test: /\.ts$/, use: ['ts-loader'] }, resolve: { extensions: ['.ts', '.js'] // 使用resolve.extensions声明自动解析.ts后缀文件,这意味着代码如【import "./a.ts"】可以忽略后缀声明 } ``` #### CSS&SCSS&LESS&STYLUS > 在Webpack中处理CSS,通常需要使用 **css-loader+style-loader 或 css-loader + min-css-extract-plugin**组合 ![image-20220829165340522](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220829165340522.png) ```json // 将CSS文件独立打包成一个新的独立的css文件 const MiniCssExtractPlugin = require('mini-css-extract-plugin') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { module: { rules: [ { test: /\.css$/i, use: ['style-loader', 'css-loader'] // 满足从右到左策略 // 约等于:style-loader(css-loader(css)) }, { test: /\.less$/i, use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'] // MiniCssExtractPlugin不能与style-loader同时使用, } ] }, plugins: [ // 提供 Loader、Plugin 组件,需要同时使用 new MiniCssExtractPlugin(), // mini-css-extract-plugin需要与html-webpack-plugin同时使用。 // 将最终参数通过 link 标签方式插入到HTML中。 new HtmlWebpackPlugin() ] } ``` #### PostCSS > 实现了一套将CSS源码解析为AST结构,并传入PostCSS插件做处理的流程框架。 ```js // postcss配置 module.exports = { plugins: [ require('autoprefixer') ] } // webpack.config.js module.exports = { module: { rules: [ { test: /\.css$/i, use: [ 'style-loader', 'postcss-loader' ] } ] } } ``` > **style-loader**与 **mini-css-extract-plugin**实现的效果有什么区别 > > style-loader主要用于开发环境,将CSS抽离并注入到HTML的style标签中,从而导致内嵌的CSS无法并行加载,会造成性能上的缺陷,从而降低页面的性能。 > > mini-css-extract-plugin主要用于生产环境,用于将CSS抽取成单个文件,然后通过 **link**标签的形式引入页面,由于 **link**是并行加载资源,故不会造成性能缺陷。并且 mini-css-extract-plugin需要与 **html-webpack-plugin**插件同时使用才能生效。 ### Vue-loader > Vue SFC 是使用类HTML语法描述Vue组件的自定义文件格式 > > **