We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
Webpack 本质上是一个模块打包器,可以根据依赖图来将我们的文件打包。
Webpack 的生命周期借助于 tapable 。tapable 类似于发布订阅库,webpack 的 hooks 就是 webpack 的生命周期,里面都是 tapable 一个实例,webpack 在适当的时机会触发这些生命周期。plugins 本质上则是通过监听 hooks 来做一些自定义处理。
根据文件配置,找到入口文件。
编译入口文件,使用配置的 loader 来处理文件。
将 loader 处理完后的文件,再由 webpack 做处理,这一步主要两件事情
文件处理完后,输出bundle文件(emit)。
对于不同的js模块方式(AMD/commonjs/import),有不同的处理方式。
比如 commonjs
compilation.dependencyFactories.set( CommonJsRequireContextDependency, contextModuleFactory );
contextModuleFactory 则是专门用来处理依赖的。
用途:可以将你引入,但是没有用到的模块在构建的时候清除掉。比如你依赖了某个模块,但其实只使用其中的某些功能。通过 tree-shaking,将没有使用的模块摇掉,这样来达到删除无用代码的目的。
局限:必须使用 es module。
局限的原因:因为它依赖了ES6的模块特性。
ES6 模块是静态分析的,不允许动态加载模块,所以可以在编译的时候就知道了模块间的依赖关系。
去除无用代码的范围:
不能去除类。
对于 webpack 来说,万物都是模块。由于 webpack 本身是用来加载 js 文件的,所以 webpack 是把所有的其他模块都当做 js 模块来处理的。因此,比如加载 css 文件的时候,会将 css 代码转为纯文本,并通过生成一段 js 代码来讲 css 纯文本转换为 style 标签并放到页面里。大概如下
const jsContent = ` const code = ${JSON.stringify(code)}; const styleEl = document.createElement("style"); const codeEl = document.createTextNode(code); styleEl.type = 'text/css'; styleEl.appendChild(codeEl); document.head.appendChild(styleEl);`; fs.writeFileSync(filename, jsContent);
Hmr 是可以让文件修改可以不重新刷新页面,主要步骤如下
拿 css 为例子,需要再接收到 HMR 后,在 dispose 的时候,移除之前挂载的 style 标签
import * as __SNOWPACK_HMR_API__ from '/${buildOptions.metaDir}/hmr.js'; import.meta.hot = __SNOWPACK_HMR_API__.createHotContext(import.meta.url); import.meta.hot.accept(); import.meta.hot.dispose(() => { document.head.removeChild(styleEl); });
Devtool 可以影响生成的代码和生成的 source-map。默认是 eval,就是生成的代码用 eval 包起来,并且没有 source-map
原理
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Webpack 本质上是一个模块打包器,可以根据依赖图来将我们的文件打包。
原理
Webpack 的生命周期借助于 tapable 。tapable 类似于发布订阅库,webpack 的 hooks 就是 webpack 的生命周期,里面都是 tapable 一个实例,webpack 在适当的时机会触发这些生命周期。plugins 本质上则是通过监听 hooks 来做一些自定义处理。
根据文件配置,找到入口文件。
编译入口文件,使用配置的 loader 来处理文件。
将 loader 处理完后的文件,再由 webpack 做处理,这一步主要两件事情
文件处理完后,输出bundle文件(emit)。
Webpack 解决依赖?
源码
对于不同的js模块方式(AMD/commonjs/import),有不同的处理方式。
比如 commonjs
contextModuleFactory 则是专门用来处理依赖的。
Tree Shaking
用途:可以将你引入,但是没有用到的模块在构建的时候清除掉。比如你依赖了某个模块,但其实只使用其中的某些功能。通过 tree-shaking,将没有使用的模块摇掉,这样来达到删除无用代码的目的。
局限:必须使用 es module。
局限的原因:因为它依赖了ES6的模块特性。
ES6模块特性
ES6 模块是静态分析的,不允许动态加载模块,所以可以在编译的时候就知道了模块间的依赖关系。
去除无用代码的范围:
不能去除类。
模块
对于 webpack 来说,万物都是模块。由于 webpack 本身是用来加载 js 文件的,所以 webpack 是把所有的其他模块都当做 js 模块来处理的。因此,比如加载 css 文件的时候,会将 css 代码转为纯文本,并通过生成一段 js 代码来讲 css 纯文本转换为 style 标签并放到页面里。大概如下
HMR
Hmr 是可以让文件修改可以不重新刷新页面,主要步骤如下
拿 css 为例子,需要再接收到 HMR 后,在 dispose 的时候,移除之前挂载的 style 标签
Devtool
Devtool 可以影响生成的代码和生成的 source-map。默认是 eval,就是生成的代码用 eval 包起来,并且没有 source-map
Vite
原理
The text was updated successfully, but these errors were encountered: