style-loader的pitch方法是先于css-loader执行的,这时候css loader处理的内容还没有生成,那么style-loader是如何引入css-loader处理的结果的?
查阅资料,说的是会通过引用requestpath:
const requestPath = loaderUtils.stringifyRequest(this, '!!' + remainingRequest);
// requestPath为:
// '!!../node_modules/css-loader/index.js!../node_modules/less-loader/dist/cjs.js!src/styles/index.less'
return `
const content = require(${requestPath})
const style = document.createElement('style');
style.innerHTML = content;
document.head.appendChild(style);
`;
};
这个path会中断loader的执行,并且执行css-loader。那么requestpath是如何被webapck处理的呢?把本次loader会执行require(${requestPath})吗?
以下是声明的loader配置
module.exports = {
entry: "./src/main.js",//入口文件
output: {//出口文件
path: path.resolve(__dirname, "build"),
filename:"bundle.js"
},
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.less$/,
use: [
'style-loader',
'css-loader',
'less-loader'
]
}
]
}
}
Webpack 如何处理loader中新依赖
当 style-loader 生成新依赖时,Webpack 会通过以下步骤将其添加到依赖图中:
步骤 1:Loader 返回新依赖
style-loader 的 pitch 函数返回了一段 JavaScript 代码,其中包含 require 语句。Webpack 会为这些代码构建moduel,并解析这些 require 语句,提取出新的依赖路径,形成新的dependency实例。
步骤 2:调用 addDependency
Webpack 在解析模块时,会调用 addDependency 方法,将新依赖添加到当前模块的依赖列表中。例如:
javascript
复制
this.addDependency(remainingRequest); // 添加 CSS 文件依赖
this.addDependency(runtimePath); // 添加运行时代码依赖
步骤 3:递归处理依赖
Webpack 会递归处理这些新依赖,对每个依赖重复模块加载、Loader 处理、依赖解析等步骤,直到所有依赖都被处理完毕。
步骤 4:更新依赖图
Webpack 会将这些依赖关系更新到依赖图(ModuleGraph)中,确保模块之间的依赖关系正确。
也就是说,style-loader执行完pitch方法后,会就结束了本次loader链的执行。webpack接收到它返回的内容,构建module,并解析内容中的依赖,形成对应的dependency实例,然后又收集dependency的loaders,构建新的loader链处理dependency。
答案:
style-loader 的 pitch 方法通过 Webpack 的内联 require 机制和 !!
前缀规则,强制中断后续 loader 执行流程,直接获取 css-loader 处理后的结果。以下是关键实现原理:
pitch 方法特性:
pitch阶段
(从左到右)和 normal阶段
(从右到左)undefined
值,会跳过后续 loader 的执行流程requestPath 的作用:
const requestPath = '!!css-loader!less-loader!./src/styles.less'
!!
前缀表示禁用所有配置中的 loader,只使用内联指定的 loaderWebpack 处理流程:
require(${requestPath})
时重新创建一个新的模块处理链:
Entry -> less-loader -> css-loader
代码生成示例:
生成的最终代码类似:
const content = __webpack_require__("!!css-loader!less-loader!./src/styles.less");
const style = document.createElement('style');
style.innerHTML = content.toString(); // 获取 css-loader 处理后的结果
document.head.appendChild(style);
验证配置的示例:
对于你的 less 规则配置:
use: ['style-loader', 'css-loader', 'less-loader']
实际执行顺序为:
!!css-loader!less-loader!xxx.less
获取处理结果关键点总结:
!!
前缀创建了一个新的独立 loader 处理链我对Polymer和Webpack都是新手,正在尝试解决如何让Polymer Webpack loader正确传输。根据新的聚合物3。x将HTML导入JS的方式(Polymer 2.x是另一种方式),我创建了一个单独的。html文件,并试图将其导入我的“extends Polymerement”类。 这是我的简单template.html文件: 这是我的聚合物指数。js文件: 这是我的webpac
django-webpack-loader Read http://owaislone.org/blog/webpack-plus-reactjs-and-django/ for a detailed step by step guide on setting up webpack with django using this library. Use webpack to generate yo
css-loader The css-loader interprets @import and url() like import/require() and will resolve them. Getting Started ⚠ To use css-loader, webpack@5 is required To begin, you'll need to install css-load
我正在尝试通过WebPack用TypeScript构建一个测试项目。在index.ts中只导入了index.ts文件和base.less(或base.css)文件,但它在css-loader上出现错误而失败。没有导入更少(CSS)文件的.ts文件全部工作良好。 我有另一个仅使用JS的大项目(没有TypeScript),它可以使用相同的webpack.config文件(babel而不是ts加载器)。
我正在构建一个使用TypeScript和WebPack4的React应用程序。我试图从导入一个CSS文件,但我得到一个一般性错误: 我在尝试为文件添加加载器时遇到了类似的问题...我想这些问题是相关的;我的配置中的某些东西一定是关闭的,从而无法利用这些额外的加载器。 我直接从https://github.com/webpack-contrib/css-loader获取了基本的设置。 我拥有的工作得
本文向大家介绍深入理解vue-loader如何使用,包括了深入理解vue-loader如何使用的使用技巧和注意事项,需要的朋友参考一下 .vue格式的文件使用类似HTML的语法描述vue组件。每个.vue文件包含三种最基本的语言块:, vue-loader会解析这个文件中的每个语言块,然后传输到其它的loaders,最终输出到module.exports是vue组件的配置对象的CommonJS模块
我有一个问题做npm启动,这似乎是一个bug与css-loader但我不能修复它。 我读过这篇文章,但我不能让它工作:https://github.com/reactjsresources/react-webpack-babel/issues/197 我还修改了webpack.config.js,添加了: 和: 如果有人能帮忙请... 谢谢.
本文向大家介绍深入webpack打包原理及loader和plugin的实现,包括了深入webpack打包原理及loader和plugin的实现的使用技巧和注意事项,需要的朋友参考一下 本文讨论的核心内容如下: webpack 进行打包的基本原理 如何自己实现一个 loader 和 plugin 注: 本文使用的 webpack 版本是 v4.43.0 , webpack-cli 版本是 v3.3.