webpack包大小与requirejs包大小

时间:2017-02-13 16:14:41

标签: javascript webpack requirejs

我正在尝试将基于requireJS的应用程序迁移到webpack。

这个应用程序没有很多依赖项 - 实际上它只需要一个promise polyfill - 而且我已经想出了如何使用缩小的webpack来制作webpack。

使用requireJS的bundle大小为43KB,使用webpack时为121KB。

虽然121KB并不是很大,但它的尺寸显着增加。

从运行webpack --display-reasons --display-modules我了解到我的捆绑包中似乎存在一些node_module依赖项。方式超出了我的预期。

我看到的内容有bufferreadable-streamstream-httpstream-browserifycore-util-isbuffer-shims,......

这是webpack包装代码的预期/部分吗?

我可以做些什么来排除这些依赖关系吗?

这是我的webpack.config.js:

var webpack = require('webpack');

module.exports = {
    entry: {
        "mynexuz": "./js/mynexuz-api.js",
        "kws": "./js/kws-api.js",
        "main": "./js/main.js",
        "quest": "./js/quest.js"
    },

    output: {
        filename: "./dist/[name]-bundle.js",
    },

    plugins: [
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            }
        }),
        new webpack.DefinePlugin({
            'process.env': {
                'NODE_ENV': JSON.stringify('production'),
            }
        })
    ],
  
    node: {
        //stream: false,
        //process: false,
        //global: false
    },

    // Enable sourcemaps for debugging webpack's output.
    devtool: "source-map",

    resolve: {
        modules: ['js', 'js/lib', 'node_modules'],
        // Add '.ts' and '.tsx' as resolvable extensions.
        extensions: [".webpack.js", ".web.js", ".ts", ".tsx", ".js"]
    },

    module: {
        loaders: [
            // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
            {
                test: /\.js$/,
                loader: "source-map-loader",
                exclude: /node_modules/
            },
            // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.
            {
                test: /\.tsx?$/,
                loader: "awesome-typescript-loader",
                exclude: /node_modules/
            }
        ]
    },
};

2 个答案:

答案 0 :(得分:1)

在深入研究这个问题后,我发现了捆绑包大小的原因。在真正的requireJS风格中,我有:

define(['http', 'config'], function (Http, Config) { ... });

这个'http'的东西应该是指我自己的库,但是webpack将它解析为一些NPM模块,带来了所有上述的依赖。

我现在已将代码更改为:

define(['./http', 'config'], function (Http, Config) { ... });

捆绑包大小回到44KB左右。

答案 1 :(得分:0)

这对您正在使用的所有库都不起作用,但如果可能,您只需导入需要使用的实际功能/组件即可节省文件大小。

以下是lodash

的示例
import has from 'lodash/has';

上面的方法只会导入has方法。

但是,如果您执行以下任一操作:

import { has } from 'lodash';

import _ from 'lodash';

然后你将导入所有lodash库,这将增加你的文件大小。

然而,对于其他库(即当前版本的moment.js),仅导入所需库的PART并不是那么简单。

还有其他一些方法可以尝试解决这个问题(即调整你的webpack设置),但我会从这个方法开始。