【问题标题】:Import Javascript library globally via Webpack通过 Webpack 全局导入 Javascript 库
【发布时间】:2016-06-23 14:29:17
【问题描述】:

我正在尝试从我的 html 中删除 javascript 库的脚本标签,因此已从模板页面中删除了 underscore.js。

要替换它,在我的 index.js(webpack 入口点)中,我有以下内容

import 'underscore';

当我这样做时,webpack 输出的 bundle.js 文件的大小增加了 50k,所以我知道该库在 bundle.js 中。但是,当我尝试在包含 bundle.js 的页面上的控制台中使用下划线时,下划线不可用。

任何想法都将不胜感激。

const webpack = require('webpack');
const path = require('path');
const precss = require('precss');
const autoprefixer = require('autoprefixer');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const postcssImport = require('postcss-import');

module.exports = {

  context: __dirname + '/frontend',
  devtool: 'source-map',
  entry: './index.js',
  output: {
    filename: 'bundle.js',
    path: path.join(__dirname, './static'),
  },
  module: {
    loaders: [
    { test: /\.js$/, loader: 'babel', exclude: /node_modules/, query: { presets: ['es2015'] } },
    { test: /\.css$/, loader: ExtractTextPlugin.extract('style', 'css?sourceMap&importLoaders=1!postcss') },
    ],
  },
  vendor: [
    'underscore',
  ],
  plugins: [
    new ExtractTextPlugin('si-styles.css'),
    new webpack.ProvidePlugin({
      underscore: 'underscore',
    }),
  ],
  postcss: function(webpack) {
    return [
      postcssImport({ addDependencyTo: webpack }), // Must be first item in list
      precss,
      autoprefixer({ browsers: ['last 2 versions'] }),
    ];
  },

};

【问题讨论】:

  • 你不能调用_,即使你已经在你的一个模块中导入了它,因为像ES6 import语句这样的模块系统旨在避免污染全局空间。需要将该模块分配给全局范围或全局对象 (window),以便您获得对它的引用并在您导入它的模块之一之外使用它。见the WebPack docs for how to get WebPack to do this for you for any module

标签: javascript underscore.js webpack


【解决方案1】:

为了实现这一点,你可以使用这个 webpack 插件:

new webpack.ProvidePlugin({
    underscore: "underscore"
})

顺便说一句,您不必将库导入目录的索引文件中。您将可以访问该库,还可以在您的 webpack 配置文件中指定一个新入口点。然后您可以将所有供应商代码放在 vendor.js 边界中,如下所示:

entry: {
    main: [
        './app/js/main.js'
    ],
    vendor: [
            'underscore',
            'lodash',
            'my-awesome-library!'
        ]
  }

更新:egghead.io 上有一个关于如何在生产中使用 webpack 的非常好的教程。尝试check it out

【讨论】:

  • 非常感谢,已经成功了!你能解释为什么虽然它被包含在 bundle.js 中,但它不能被使用吗?
  • 感谢您的更新 - 不过我恐怕已经失去了您。我已按照建议删除了我的 index.js 的导入表单,并在我的 webpack 中添加了一个来自 vendor 的数组。但是它不再起作用......我将使用我的 webpack 配置更新我的原始问题
  • 让我检查一下我没有在第二部分给你一个不好的建议(删除导入)它对我有用,但我没有调查足够......关于你的问题第一个问题我认为它与 webpack 用来重命名所有导入的模块的方式有关。您应该尝试在您的代码中放置一个断点,并使用控制台查看哪些是变量名...希望对您有所帮助..
猜你喜欢
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 2012-07-02
  • 2012-07-14
  • 1970-01-01
  • 2018-08-26
相关资源
最近更新 更多