webpack - 修改 Webpack 的 MainTemplate
问题描述
我想编写一个修改主模板的 Webpack 插件,这样我就可以在函数中插入一些额外的代码__webpack__require__
。
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Some extra code here --------------------------------------
/******/
/******/ // Execute the module function!!
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
有谁知道要使用哪些钩子以及如何执行此操作?
解决方案
对于其他有兴趣做同样事情的人,以下代码适用于 Webpack v4:
webpack.config.js
const path = require('path');
class VendorImportPlugin {
constructor(options) {
this.options = options;
}
apply(compiler) {
compiler.hooks.compilation.tap('VendorImport', compilation => {
compilation.mainTemplate.hooks.localVars.tap('Require', (source) => {
// return string for "localVars" section
return `// New code in localVars section\n\m${source}`;
});
compilation.mainTemplate.hooks.require.tap('Resolve', (source) => {
// return string for require function code
return `// New code in require section\n\m${source}`;
});
});
}
};
module.exports = {
// ...
plugins: [new VendorImportPlugin({
// options
})]
};
dist/main.js
(function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap
/******/ // New code in localVars section
/******/
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // New code in require section
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
推荐阅读
- javascript - 在地图功能中反应条件渲染组件
- docker - docker run 后自动删除文件
- ios - iOS 编程:更详细地了解第一响应者
- javascript - 如何在 React.js 而不是 jQuery 或任何其他框架中获得选定的选项?
- java - 如何在springboot mongo-data中使用$in操作符
- javascript - React Modal 总是使用一行中的相同记录
- algorithm - A* 是否从边缘以增量成本顺序(如 Dijkstra 的)弹出节点以获得一致的启发式?
- swift - 如何对 SIMD3 进行类型转换
ARFaceGeometry 顶点坐标 - python - 如何使用 pandas .eval() 来评估多列上的操作。?
- html - 部署到 pythonanywhere.com 时未显示 Django 应用程序页面