如何从使用 webpack 的 MDL 获取 svg

Posted

技术标签:

【中文标题】如何从使用 webpack 的 MDL 获取 svg【英文标题】:How to get svg from MDL working with webpack 【发布时间】:2016-09-16 07:58:43 【问题描述】:

使用 Material Design Lite 中的复选框组件,即 https://getmdl.io/components/index.html#toggles-section/checkbox

使用时tickmark.svg 显示不正确

import '../../node_modules/material-design-lite/src/material-design-lite.scss';

用于与 npm 和 webpack 捆绑。而不是:

我明白了:

在浏览器中,我找到了以下到 tickmark.svg 的路径,这是“缺失”的 svg:

当使用这两种替代方法中的任何一种时,它都可以正常工作: 1)import '../../node_modules/material-design-lite/.tmp/material-design-lite.css'; 2)import '../../node_modules/material-design-lite/material.min.css';

为了比较,当使用 2 时,我在浏览器中得到以下信息:

我的 webpack.config.js:

var path = require('path');
var webpack = require('webpack');
var BundleTracker = require('webpack-bundle-tracker');
var HtmlWebpackPlugin = require('html-webpack-plugin');
var Clean = require('clean-webpack-plugin');
var bootstrapPath = path.join(__dirname, 'node_modules/bootstrap/dist/css');
var sourcePath = path.join(__dirname, 'assets');

module.exports = 
    devtool: 'eval-source-map',
    context: __dirname,
    entry: [
        './assets/js/index' // entry point of our app. .assets/js/index.js should require other js modules and dependencies it needs
    ],
    output: 
        path: path.resolve('./assets/bundles/'),
        filename: '[name]-[hash].js',
    
    ,
    node: 
        console: true,
        fs: 'empty'
    
    ,
    plugins: [
        new webpack.ProvidePlugin(
            $: 'jquery',
            jQuery: 'jquery'
        ),
        new BundleTracker(filename: './webpack-stats.json'),
        new webpack.BannerPlugin('Pqbq Banner!!!! todo'),
        new HtmlWebpackPlugin(
            template: __dirname + '/assets/index.tmpl.html'
        ),
        new webpack.HotModuleReplacementPlugin(),
        new webpack.NoErrorsPlugin(),
        new Clean(['assets/bundles'])
    ],
    module: 
        preloaders: [
            
                test: /\.js/,
                loader: 'eslint'
            
        ],
        loaders: [
            
                test: /\.js[x]?$/,
                loader: 'babel',
                exclude: /(node_modules|bower-components)/,
                query: 
                    presets: ['es2015', 'stage-0']
                
            ,
            
                test: /\.json$/,
                loader: 'json-loader'
            ,
            
                test: /\.js$/,
                include: path.resolve(__dirname, 'node_modules/mapbox-gl/js/render/shaders.js'),
                loader: 'transform/cacheable?brfs'
            ,
            
                test: /\.js$/,
                include: path.resolve(__dirname, 'node_modules/webworkify/index.js'),
                loader: 'worker'
            ,
            // 
            //     test: /\.css$/,
            //     loader: 'style!css?modules!postcss'
            // ,
            
                test: /\.scss$/,
                loaders: ['style', 'css?sourceMap', 'sass?sourceMap']
            ,
            // test: /\.(woff2?|svg)$/, loader: 'url?limit=10000',
            // test: /\.(ttf|eot)$/, loader: 'file',
            test: /\.css$/, loader: 'style-loader!css-loader',
            test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file',
            test: /\.(woff|woff2)$/, loader: 'url?prefix=font/&limit=5000',
            test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&mimetype=application/octet-stream',
            //   test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&mimetype=image/svg+xml',
            test: /\.svg$/, loader: 'url?limit=8192!svgo',
        ]
    
    ,
    postcss: [
        require('autoprefixer')
    ],
    resolve: 
        modulesDirectories: ['node_modules', 'bower_components', bootstrapPath, sourcePath],
        extensions: ['', '.js', '.jsx', '.css'],
        alias: 
            webworkify: 'webworkify-webpack',
            '$': 'jquery',
            'jQuery': 'jquery'
        
    
    ,
    devServer: 
        contentBase: './assets',
        colors: true,
        historyApiFallback: true,
        inline: true,
        hot: true
    
;

【问题讨论】:

这并不能完全解决问题,但问题的一部分是实际 url 是 .svg?embed 与您的 test 正则表达式不匹配。我看到了同样的问题。尝试使用/\.svg(\?embed)?$/ @pho3nixf1re 好点!我试过了,但问题仍然存在(相同的控制台输出)。这个正则表达式确实能正确捕捉到它吗? @pho3nixf1re 我检查了你的正则表达式,它确实应该捕获'.svg?embed'。如果您在解决此问题方面有进一步的进展,请告诉我! 【参考方案1】:

为了解决这个问题,我必须通过创建自己的 material.scss 文件来覆盖 $image_path 变量。我抓住了这个文件:

https://github.com/google/material-design-lite/blob/master/src/material-design-lite.scss

然后添加:

@import "./variables";

在顶部。

在那个文件中我添加了这一行:

$image_path: '~material-design-lite/dist/images/' !default;

【讨论】:

以上是关于如何从使用 webpack 的 MDL 获取 svg的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 深潜 - MDL 锁的实现与获取机制

如何在循环中使用 Material Design “mdl-tooltip”

如何从python将'a sv' dbus签名传递给udisks2.Mount()?

如何在 Visual Studio 中更改 MVC 项目中使用的前端框架?

从 Webpack bundle.js 获取/导入 bootstrap.js

如何将 MDL 按钮样式应用于文件选择器?