【问题标题】:Webpack and toastrWebpack 和 toastr
【发布时间】:2017-03-11 07:43:38
【问题描述】:

我正在尝试使用 webpack 加载和捆绑 toastr 作为依赖项。

这是整个 webpack 配置文件

var path = require('path');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var webpack = require('webpack');

const DEVELOPMENT = process.env.NODE_ENV === 'development';
const PRODUCTION = process.env.NODE_ENV === 'production';

module.exports = {
    entry: {
        main: './wwwroot/js/mainEntry.js',
        vendor: ['jquery', 'tether',
            'bootstrap', 'jquery-colorbox',
            'jquery-confirm', 'jquery-validation',
            'jquery-validation-unobtrusive',
            'toastr', 'jquery.nicescroll',]
    },
    output: {
        filename: '/js/[name].js',
        path: path.resolve(__dirname, 'wwwroot'),
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    use: "css-loader"
                })
            },
            {
                test: /\.(ttf|otf|eot|svg|woff(2)?)(\?[a-z0-9]+)?$/,
                loader: 'file-loader?name=[name].[ext]&publicPath=/fonts/&outputPath=/fonts/'
            },
            {
                test: /\.(png|jpe?g|gif|ico)$/,
                loader: 'file-loader?name=[name].[ext]&publicPath=/images/&outputPath=/images/'
            }
        ]
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin({
            name: "vendor",
            // (the commons chunk name)
            filename: "/js/vendor.js",
            // (the filename of the commons chunk)
            minChunks: 2,
        }),
        new ExtractTextPlugin({
            filename: 'css/[name].min.css'
        }),
        new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery"
        })
    ],
};

和我的入口js文件一样

//JS
import 'jquery-colorbox';
import 'slick-carousel';
import toastr from 'toastr';

//CSS
import './../../node_modules/bootstrap/dist/css/bootstrap.css';
import './../../node_modules/slick-carousel/slick/slick.css';
import './../../node_modules/jquery-colorbox/colorbox.css';
import './../../node_modules/toastr/build/toastr.css';
import './../../node_modules/jquery-confirm/css/jquery-confirm.css';
import './../../node_modules/font-awesome/css/font-awesome.css';
import './../../Modules/Components/Menu/menu.css';
import './../../wwwroot/css/lahuritv.css';

包的创建没有任何错误。当我查看输出包时,我可以看到 toastr 脚本包含在包中。但问题是变量toastr在浏览器窗口中不可用。

我尝试寻找类似的问题,但找不到任何问题。这是我第一次尝试学习 webpack。任何帮助表示赞赏。

【问题讨论】:

    标签: javascript webpack webpack-2 toastr


    【解决方案1】:

    简单的解决方案:

    //app.js
    import toastr from 'toastr'
    window.toastr = toastr
    

    【讨论】:

      【解决方案2】:

      Webpack 不会公开您导入的模块,它会将您的代码与所需的依赖项捆绑在一起,但它们仍然是模块化的并且有自己的范围。 Webpack 不会只是盲目地组合所有文件的来源,当然也不会使所有内容都全球化。如果您发布的入口文件是整个文件,那么您根本没有做任何事情。

      使用 webpack,您可以在捆绑的 JavaScript 文件中完成工作。可以这么说,您在 HTML 中包含的所有内容都是由 webpack 创建的包,您不包含尝试访问包中某些内容的其他脚本,而是直接在包中进行。

      当然你可以通过显式定义它来暴露给windowwindow.toastr = toastr 在导入toastr 之后,但是污染全局范围通常不是一个好主意,它与仅仅在一个<script> 标签。如果捆绑包只是应该用作库,您可以查看Authoring Libraries。但我认为你只是在做一个普通的 web 应用程序,你应该将所有代码放在一起以由 webpack 捆绑,而不是依赖于另一个 <script> 标签。

      您应该阅读官方文档的Getting Started 指南。该示例非常小(创建一个 DOM 元素),但向您展示了 webpack 应用程序的概念,并且还使用了外部依赖项。

      【讨论】:

      • 感谢您的详细解答。我想我明白你的意思。 toastr 模块仅在捆绑脚本中可用,并且不作为全局变量公开,我需要对 toastr 执行的任何操作都必须在捆绑脚本中完成。但在我的情况下,toastr 模块实际上需要在全局范围内可用,因为有一个 ASP.NET 库使用 toastr 将脚本标记动态插入(服务器渲染)到视图文件的主体标记中。所以,我想我将不得不使用 toastr 作为某种外部依赖项,它始终在全局范围内可用。
      • 正确,一般是webpack的方式。但是,如果您要将需要全局变量的旧网站转换为 webpack,您仍然有可能公开一些所需的值。但一般情况下,您应该尽可能避免使用全局变量并将其保留在包中。
      • 你是对的。我正在转换一个旧网站,在这种情况下,我别无选择,只能将 toastr 作为全局变量公开。谢谢你的帮助。我现在已经解决了这个问题。
      猜你喜欢
      • 2013-02-15
      • 2023-03-17
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多