来自其他类的Webpack访问类

时间:2016-07-07 08:04:17

标签: javascript jquery webpack

我正在尝试从webpacked的其他类访问类函数。 我有:

var App = function () {
    getResponsiveBreakpoint: function(size) {
        var sizes = {
            'xs' : 480,     // extra small
            'sm' : 768,     // small
            'md' : 992,     // medium
            'lg' : 1200     // large
        };

        return sizes[size] ? sizes[size] : 0;
    }
}

我希望从以下位置访问此功能:

var Layout = function() {
    var resBreakpointMd = App.getResponsiveBreakpoint('md');
}

这些类是webpacked,这是配置:

    var path                  = require('path'),
        webpack               = require('webpack'),
        ExtractTextPlugin     = require("extract-text-webpack-plugin"),
        autoprefixer          = require('autoprefixer'),
        precss                = require('precss'),
        ProvidePlugin         = require('webpack/lib/ProvidePlugin'),
        jsPath                = './js',
        jsLayoutPath          = './js/layout',
        cssPath               = './css',
        cssLayoutPath         = './css/layout',
        cssThemesPath         = './css/layout/themes';

    module.exports = {
        entry: {
            login: [jsPath + '/login.js', cssPath + '/login.css'],
            layout: [jsLayoutPath + '/layout.js', cssLayoutPath + '/layout.css'],
            custom: cssLayoutPath + '/custom.css',
            vendor: [
                cssPath + '/bootstrap.css',
                cssPath + '/bootstrap-switch.css',
                cssPath + '/font-awesome.css',
                cssPath + '/datatables.bootstrap.css',
                cssPath + '/datatables.css',
                cssPath + '/datatables.font-awesome.css',
                cssPath + '/select2.css',
                cssPath + '/select2-bootstrap.css',
                cssPath + '/components.css',
                cssPath + '/plugins.css',
                cssPath + '/daterangepicker.css',
                cssPath + '/uniform.default.css',
                jsPath + '/jquery.js',
                jsPath + '/jquery.blockUI.js',
                jsPath + '/bootstrap.js',
                jsPath + '/bootstrap-hover-dropdown.js',
                jsPath + '/bootstrap-switch.js',
                jsPath + '/select2.full.js',
                jsPath + '/jquery.waypoints.min.js',
                jsPath + '/jquery.slimscroll.js',
                jsPath + '/jquery.counterup.js',
                jsPath + '/jquery.uniform.js',
                jsPath + '/jquery.validate.js',
                jsPath + '/jquery.form.js',
                jsPath + '/additional-methods.js',
                jsPath + '/datatables.js',
                jsPath + '/datatables.bootstrap.js',
                jsPath + '/app.js'
            ],
            respond: jsPath + '/respond.src.js',
            excanvas: jsPath + '/excanvas.js'
        },
        output:  {
            path: __dirname + "/../../web/assets/js/", publicPath: '/assets/js/', filename: "[name].js"
        },
        module:  {
            loaders: [
                {
                    test: /\.css$/,
                    exclude: /node_modules/,
                    loader: ExtractTextPlugin.extract("style-loader", "css-raw-loader!postcss-loader")
                },
                { test: /jquery\.js$/, loader: 'expose?$' },
                { test: /jquery\.js$/, loader: 'expose?jQuery' },
                { test: /datatables\.js$/, loader: 'expose?DataTable' },
                { test: /jquery\.form\.js$/, loader: "imports?define=>false" },
                {
                    test:    /\.js(x)?$/,
                    exclude: /node_modules/,
                    loader:  'babel',
                    query:   {
                        plugins:   [
                            "transform-class-properties"
                        ],
                        "presets": [
                            "stage-0",
                            "es2015",
                            "react"
                        ],
                        compact: false
                    }
                },
            ],
            postcss: function() {
                return [autoprefixer, precss];
            }
        },
        plugins: [
            new webpack.ProvidePlugin({
                $: "jquery",
                jQuery: "jquery",
                "window.jQuery": "jquery",
                "DataTable": "datatables.net"
            }),
            new webpack.optimize.UglifyJsPlugin({
                compress: { warnings: false },
            }),
            new webpack.optimize.CommonsChunkPlugin("commons", "../js/commons.min.js"),
            new ExtractTextPlugin("../css/[name].min.css", {
                allChunks: true
            }),
        ]
    };

我怎样才能做到这一点?我尝试使用expose模块,但从未成功。谢谢!

1 个答案:

答案 0 :(得分:1)

我会改写为答案。作为Webpack配置的JavaScript的一部分,你可以做很多事情来改进,但我会试着关注这个问题。

  1. 使用模块

    import App from '../app.js';
    
    var Layout = function() {
        var resBreakpointMd = App.getResponsiveBreakpoint('md');
    }
    

    var App = {
        getResponsiveBreakpoint: function(size) {
            var sizes = {
                'xs' : 480,     // extra small
                'sm' : 768,     // small
                'md' : 992,     // medium
                'lg' : 1200     // large
            };
            return sizes[size] ? sizes[size] : 0;
        }
      }
    
    export default App;
    
  2. 您将getResponsiveBreakpoint定义为函数的成员,因此它在词法范围内。这样,它无法从外部访问。最简单的方法是将其转换为对象,就像我在上面的代码中所做的那样

  3. 根据您想要实现的目标,您还可以将其作为函数的静态成员:

    var App = function () {
        // some logic here  
    }
    
    App.getResponsiveBreakpoint: function(size) {
       var sizes = {
           'xs' : 480,     // extra small
           'sm' : 768,     // small
           'md' : 992,     // medium
           'lg' : 1200     // large
        };
        return sizes[size] ? sizes[size] : 0;
    }
    
    export default App;
    

    我希望现在有所帮助。