排除webpack中的一些css文件 [英] Exclude some css files in webpack

查看:57
本文介绍了排除webpack中的一些css文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用 webpack 时遇到问题.我的项目具有以下结构.

文件夹结构:

srcjsapp.js//用于导入 app.scss 文件vendor.js//用于导入 vendor.scss 文件scssapp.scss//我们的自定义样式vendor.scss//需要 node_modules 中的所有供应商样式包.jsonpostcss.config.jswebpack.config.js

scss 文件夹内有 2 个文件 app.scss &vendor.scss.app.scss 文件包含我们所有的自定义样式,vendor.scss 文件包含所有供应商样式,例如引导库样式.

webpack 命令后:

npm run dev

Webpack 通过 JavaScript 文件导入这些 scss 文件并通过 postcss-loader 添加供应商前缀并输出一个 dist文件夹.

但我不想在 vendor.scss 文件上添加供应商前缀,因为供应商库已经有供应商前缀.那么有没有办法从 postcss-loader 中排除 vendor.scss 文件.

完整代码:

src/js/app.js:

import '../scss/app.scss'

src/js/vendor.js:

import '../scss/vendor.scss'

src/scss/app.scss:

//我们的自定义样式.应用程序 {显示:弹性;}

src/scss/vendor.scss:

//供应商样式.容器 {显示:弹性;}@import '~bootstrap/scss/bootstrap';

package.json:

<代码>{"name": "测试","版本": "1.0.0",描述": "",私人":真的,脚本":{"test": "echo \"Error: no test specified\" && exit 1","dev": "webpack --mode development --progress true --colors"},作者": "","许可证": "麻省理工学院",依赖关系":{引导程序":^4.2.1"},开发依赖":{"@babel/core": "^7.2.2","@babel/preset-env": "^7.3.1","autoprefixer": "^9.4.6","babel-loader": "^8.0.5","css-loader": "^2.1.0","filemanager-webpack-plugin": "^2.0.5","mini-css-extract-plugin": "^0.5.0","node-sass": "^4.11.0","postcss-loader": "^3.0.0","sass-loader": "^7.1.0","webpack": "^4.29.0","webpack-cli": "^3.2.1"}}

postcss.config.js:

module.exports={插件: [要求('自动前缀')({浏览器":['> = 1%','最后一个主要版本','没死','铬 >= 45','火狐 >= 38','边>= 12','资源管理器 >= 10','iOS >= 9','Safari >= 9','安卓 >= 4.4','歌剧 >= 30'],级联:真})]};

webpack.config.js:

const path = require('path');const MiniCssExtractPlugin = require('mini-css-extract-plugin');const FileManagerPlugin = require('filemanager-webpack-plugin');module.exports = function() {返回 ({入口: {'供应商':'./src/js/vendor.js','app': './src/js/app.js',},输出: {路径:path.resolve(__dirname, 'dist'),文件名:'js/[名称].[chunkhash].js'},模块: {规则:[{测试:/\.js$/,排除:/(节点模块)/,用: {loader: 'babel-loader',选项: {预设:['@babel/preset-env']}}},{测试:/\.(sa|sc|c)ss$/,用: [{加载器:MiniCssExtractPlugin.loader,选项: {公共路径:'../'}}, {加载器:'css-加载器',},//将 CSS 翻译成 CommonJS{loader: 'postcss-loader',},//在构建 css 文件中添加供应商前缀{loader: 'sass-loader',}//将 Sass 编译成 CSS]},]},插件: [新的 MiniCssExtractPlugin({文件名:'css/[名称].[contenthash].css'}),//构建前新的文件管理器插件({开始:{删除: ['区',],}}),]});};

Zip 文件.

解决方案

所以你希望供应商前缀不要添加到 Webpack 生成的 vendor.css 文件中.

记住 Webpack 以相反的顺序解析加载器数组.您可以使用正则表达式在 postcss-loader 的对象上添加 exclude 属性.

webpack.config.js:

const path = require('path');const MiniCssExtractPlugin = require('mini-css-extract-plugin');const FileManagerPlugin = require('filemanager-webpack-plugin');module.exports = function() {返回 ({入口: {'供应商':'./src/js/vendor.js','app': './src/js/app.js',},输出: {路径:path.resolve(__dirname, 'dist'),文件名:'js/[名称].[chunkhash].js'},模块: {规则:[{测试:/\.js$/,排除:/(节点模块)/,用: {loader: 'babel-loader',选项: {预设:['@babel/preset-env']}}},{测试:/\.s(c|a)ss$/,用: {加载器:MiniCssExtractPlugin.loader,选项: {公共路径:'../'}},//取scss文件,拆分成单独的css文件},{测试:/\.s(c|a)ss$/,用: {加载器:'css-加载器',},//像import/require()一样解释scss@import和url()},{测试:/\.s(c|a)ss$/,排除:[/供应商/],用: {loader: 'postcss-loader',},},//PostCSS 把你的 SCSS 文件变成一个 JS 对象 &将该对象转换回 SCSS 文件{测试:/\.s(c|a)ss$/,用: {loader: 'sass-loader',},//通过sass-loader查找scss文件,将scss编译成css代码},]},插件: [新的 MiniCssExtractPlugin({文件名:'css/[名称].[contenthash].css'}),//构建前新的文件管理器插件({开始:{删除: ['区',],}}),]});};

I'm facing a problem with webpack. My project has the following structure.

Folder structure:

src
  js
    app.js  // For importing app.scss file
    vendor.js // For importing vendor.scss file
  scss
    app.scss // Our custom styles
    vendor.scss // Require all vendor styles from node_modules
package.json
postcss.config.js
webpack.config.js

Inside scss folder there are 2 files app.scss & vendor.scss. app.scss file contains all our custom styles, vendor.scss file contains all vendor styles such as bootstrap library styles.

After webpack command:

npm run dev

Webpack import these scss files through JavaScript files and add vendor prefixes via postcss-loader and output on a dist folder.

But I don't want to add vendor prefixes on vendor.scss file because the vendor library already has vendor prefixes. So is there a way to exclude vendor.scss file from postcss-loader.

Full Code:

src/js/app.js:

import '../scss/app.scss'

src/js/vendor.js:

import '../scss/vendor.scss'

src/scss/app.scss:

// Our custom styles
.app {
  display: flex;
}

src/scss/vendor.scss:

// Vendor Styles
.container {
  display: flex;
}

@import '~bootstrap/scss/bootstrap';

package.json:

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "private": true,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack --mode development --progress true --colors"
  },
  "author": "",
  "license": "MIT",
  "dependencies": {
    "bootstrap": "^4.2.1"
  },
  "devDependencies": {
    "@babel/core": "^7.2.2",
    "@babel/preset-env": "^7.3.1",
    "autoprefixer": "^9.4.6",
    "babel-loader": "^8.0.5",
    "css-loader": "^2.1.0",
    "filemanager-webpack-plugin": "^2.0.5",
    "mini-css-extract-plugin": "^0.5.0",
    "node-sass": "^4.11.0",
    "postcss-loader": "^3.0.0",
    "sass-loader": "^7.1.0",
    "webpack": "^4.29.0",
    "webpack-cli": "^3.2.1"
  }
}

postcss.config.js:

module.exports={
  plugins: [
    require('autoprefixer')({
      'browsers': [
        '>= 1%',
        'last 1 major version',
        'not dead',
        'Chrome >= 45',
        'Firefox >= 38',
        'Edge >= 12',
        'Explorer >= 10',
        'iOS >= 9',
        'Safari >= 9',
        'Android >= 4.4',
        'Opera >= 30'
      ],
      cascade: true
    })
  ]
};

webpack.config.js:

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const FileManagerPlugin = require('filemanager-webpack-plugin');
module.exports = function() {
    return ({
        entry: {
            'vendor': './src/js/vendor.js',
            'app': './src/js/app.js',
        },
        output: {
            path: path.resolve(__dirname, 'dist'),
            filename: 'js/[name].[chunkhash].js'
        },
        module: {
            rules: [{
                    test: /\.js$/,
                    exclude: /(node_modules)/,
                    use: {
                        loader: 'babel-loader',
                        options: {
                            presets: ['@babel/preset-env']
                        }
                    }
                },
                {
                    test: /\.(sa|sc|c)ss$/,
                    use: [{
                            loader: MiniCssExtractPlugin.loader,
                            options: {
                                publicPath: '../'
                            }
                        }, {
                            loader: 'css-loader',
                        }, // translates CSS into CommonJS
                        {
                            loader: 'postcss-loader',
                        }, // Add vendor prefixes on build css file
                        {
                            loader: 'sass-loader',
                        } // compiles Sass to CSS
                    ]
                },
            ]
        },
        plugins: [
            new MiniCssExtractPlugin({
                filename: 'css/[name].[contenthash].css'
            }),
            // Before Build
            new FileManagerPlugin({
                onStart: {
                    delete: [
                        'dist',
                    ],
                }
            }),
        ]
    });
};

Zip file.

解决方案

So you want vendor prefixes don't add on Webpack generated vendor.css file.

Remember Webpack parse loader array on reverse order. You could add exclude property on the object of postcss-loader with the regular expression.

webpack.config.js:

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const FileManagerPlugin = require('filemanager-webpack-plugin');
module.exports = function() {
    return ({
        entry: {
            'vendor': './src/js/vendor.js',
            'app': './src/js/app.js',
        },
        output: {
            path: path.resolve(__dirname, 'dist'),
            filename: 'js/[name].[chunkhash].js'
        },
        module: {
            rules: [{
                    test: /\.js$/,
                    exclude: /(node_modules)/,
                    use: {
                        loader: 'babel-loader',
                        options: {
                            presets: ['@babel/preset-env']
                        }
                    }
                },
                {
                    test: /\.s(c|a)ss$/,
                    use: {
                        loader: MiniCssExtractPlugin.loader,
                        options: {
                            publicPath: '../'
                        }
                    },// Take scss file and split into a separate css file
                },
                {
                    test: /\.s(c|a)ss$/,
                    use: {
                        loader: 'css-loader',
                    },// Interprets scss @import and url() like import/require()
                },
                {
                    test: /\.s(c|a)ss$/,
                    exclude: [/vendor/],
                    use: {
                        loader: 'postcss-loader',
                    },
                }, // PostCSS turns your SCSS file into a JS object & converts that object back to a SCSS file
                {
                    test: /\.s(c|a)ss$/,
                    use: {
                        loader: 'sass-loader',
                    },// look for scss file through sass-loader, compile scss into css code
                },
            ]
        },
        plugins: [
            new MiniCssExtractPlugin({
                filename: 'css/[name].[contenthash].css'
            }),
            // Before Build
            new FileManagerPlugin({
                onStart: {
                    delete: [
                        'dist',
                    ],
                }
            }),
        ]
    });
};

这篇关于排除webpack中的一些css文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆