js逆向webpack

本文详细解析了Webpack中模块加载的两种常见形式:动态导入与自执行函数,以及如何从实际代码中提取和简化模块加载器。通过实例演示了如何识别和分离核心的模块加载逻辑,适合理解Webpack模块管理机制。
摘要由CSDN通过智能技术生成

扣代码会遇到的基本2种形式

1、webpack

function (x){//这里的x是存放模块1、模块2那个数组
    function xx(yy){//yy是存放模块1、模块2的数组下标
        x[yy].call(模块参数1,模块参数2,模块参数3);//必有一个加载模块的方法call或者apply
    }
    xx(0);//就是xx方法调用了,存放模块数组的第1个元素,也就是模块1
    //xx(1);//就是xx方法调用了,存放模块数组的第2个元素,也就是模块2
}([
function(模块参数1,模块参数2,模块参数3){},
function(模块参数1,模块参数2,模块参数3){}
]);//模块1,模块2.。。

webpack扣流程:

1、找到加载器(加载模块的方法)

2、找到调用的模块

3、构造一个自执行方法

案例:例如定位到的方法在一个webpackjs文件中

//定位到的webpack原代码
!function(t) {
    function e(s) {
        if (i[s])
            return i[s].exports;
        var n = i[s] = {
            exports: {},
            id: s,
            loaded: !1
        };
        return t[s].call(n.exports, n, n.exports, e),
        n.loaded = !0,
        n.exports
    }
    var i = {};
    return e.m = t,
    e.c = i,
    e.p = "",
    e(0)
}({
    0: function(t, e, i) {
    
    },
    1: function(t, e) {
       
    },
    2: function(t, e, i) {
    },
    3: function(t, e, i) {
    },
    4: function(t, e, i) {},
    5: function(t, e, i) {},
    6: function(t, e, i) {},
    10: function(t, e, i) {},
    11: function(t, e, i) {},
    12: function(t, e, i) {},
    14: function(module, exports, __webpack_require__) {},
    15: function(t, e, i) {},
    42: function(t, e, i) {},
    43: function(t, e, i) {},
    44: function(t, e, i) {},
    56: function(t, e, i) {}
});

然后把他的模块加载器扣下来

//扣下来的模块加载器
!function(t) {
    function e(s) {
        if (i[s])
            return i[s].exports;
        var n = i[s] = {
            exports: {},
            id: s,
            loaded: !1
        };
        return t[s].call(n.exports, n, n.exports, e),
        n.loaded = !0,
        n.exports
    }
    var i = {};
    return e.m = t,
    e.c = i,
    e.p = "",
    e(0)
}(

然后简化下加载器,对照着上面webpack最简单的样子,简化

//扣下来的模块加载器
!function(t) {
    //由于下面用到i,看下面代码,i是个对象,所以这里定义一个i的空对象,也可以把调用i的代码删掉
    var i = {};
    function e(s) {//模块加载器
        if (i[s])
            return i[s].exports;
        var n = i[s] = {
            exports: {},
            id: s,
            loaded: !1
        };
        return t[s].call(n.exports, n, n.exports, e),
        n.loaded = !0,
        n.exports
    }
    //下面这几行删掉,只留上面这个模块加载器方法
    //var i = {};
    //return e.m = t,
    //e.c = i,
    //e.p = "",
    //e(0)
}();

//扣下来的模块加载器2,删掉i
!function(t) {
    //由于下面用到i,看下面代码,i是个对象,所以这里定义一个i的空对象,也可以把调用i的代码删掉
    //var i = {};
    function e(s) {//模块加载器

        var n =  {
            exports: {},
            id: s,
            loaded: !1
        };
        return t[s].call(n.exports, n, n.exports, e),
        n.loaded = !0,
        n.exports
    }
    //下面这几行删掉,只留上面这个模块加载器方法
    //var i = {};
    //return e.m = t,
    //e.c = i,
    //e.p = "",
    //e(0)
}()

webpack遇到其它站的代码,扣加载器的时候,例如下图,除了function n(t){}这个函数,其它代码都删掉,判断标准是它带call或者apply

 上图扣好后的代码如图:

2、常规写法

function(){}
function(){}

为了避免违反规则3,我将只介绍如何使用webpack进行打包和优化,而不会涉及逆向webpack的方法。 Webpack是一个现代JavaScript应用程序的静态模块打包器。将应用程序的所有依赖项视为模块,并将它们打包成一个或多个静态资源。Webpack还可以通过各种插件和加载器来优化和转换这些资源。 以下是使用Webpack进行打包和优化的一些方法: 1.安装WebpackWebpack CLI 在使用Webpack之前,需要先全局安装Webpack CLI脚手架,并在项目中安装Webpack。 ```shell npm install webpack-cli -g npm install webpack --save-dev ``` 2.创建Webpack配置文件 在项目根目录下创建一个名为webpack.config.js的文件,并在其中定义Webpack的配置选项。 ```javascript const path = require('path'); module.exports = { entry: './src/index.js', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') } }; ``` 上述配置文件指定了入口文件为src/index.js,输出文件为dist/bundle.js。 3.使用Webpack加载器 Webpack加载器可以将各种类型的文件转换为JavaScript模块,以便Webpack可以将它们打包到应用程序中。例如,使用Babel加载器可以将ES6代码转换为ES5代码。 ```javascript module.exports = { // ... module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } } ] } }; ``` 上述配置文件指定了使用Babel加载器来转换所有.js文件。 4.使用Webpack插件 Webpack插件可以用于优化和转换打包后的代码。例如,使用UglifyJS插件可以压缩JavaScript代码。 ```javascript const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); module.exports = { // ... plugins: [ new UglifyJSPlugin() ] }; ``` 上述配置文件指定了使用UglifyJS插件来压缩打包后的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值