资讯专栏INFORMATION COLUMN

react antd-mobile 项目中实现 css 与 less 局部作用域化

Snailclimb / 2493人阅读

摘要:前言最近搭建的项目想引入并实现样式局部作用域化,但是在网上找了很多方法试过了都不行,最后打到解决方法,在此记下这惨痛的历程。

微信公众号:爱写bugger的阿拉斯加
如有问题或建议,请后台留言,我会尽力解决你的问题。
1. 前言

最近搭建的 react 项目想引入 less ,并实现样式局部作用域化,但是在网上找了很多方法试过了都不行,最后打到解决方法,在此记下这惨痛的历程。

2. create-react-app

create-react-app 是业界最优秀的 React 相关应用开发工具之一,本文档就是以此工具来使用 antd-mobile 组件。

安装和初始化#
$ npm install -g create-react-app

# 注意:工具会自动初始化一个脚手架并安装 React 项目的各种必要依赖,如果在过程中出现网络问题,请尝试配置代理或使用其他 npm registry。
$ create-react-app my-app

$ cd my-app
$ npm start

打开 http://localhost:3000/ 访问你的应用。

3. 修改 css 配置

下面是修改文件 webpack.config.js

module.exports = {
   entry: __dirname + "/index.js",
   output: {
     publicPath: "/",
     filename: "./bundle.js"
   },
   module: {
     loaders: [
       {
         test: /.jsx?$/,
         exclude: /node_modules/,
         loader: "babel",
         query: {
           presets: ["es2015", "stage-0", "react"]
         }
       },
       {
         test: /.css$/,
         loader: "style-loader!css-loader?modules"
       },
     ]
   }
 };

上面代码中,关键的一行是style-loader!css-loader?modules,它在css-loader后面加了一个查询参数modules,表示打开 CSS Modules 功能。

4. 配置 less

首先安装 less 和 less-loader

npm i --save-dev less less-loader

然后在 webpack.config.dev 中配置 less :

//这里我开启自己编写的less文件的css modules功能 除了node_modules库中的less,
                    //也就是可以过滤掉antd库中的样式
                    {
                        test: /.less$/,
                        exclude: [/node_modules/],
                        use: [
                            require.resolve("style-loader"),
                            {
                                loader: require.resolve("css-loader"),
                                options: {
                                    modules: true,
                                    localIndexName: "[name]__[local]___[hash:base64:5]"
                                },
                            },
                            {
                                loader: require.resolve("less-loader"), // compiles Less to CSS
                            },
                        ],
                    },
5. 完整配置

送上完整的 webpack.config.dev 配置:

"use strict";

const autoprefixer = require("autoprefixer");
const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin");
const InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin");
const WatchMissingNodeModulesPlugin = require("react-dev-utils/WatchMissingNodeModulesPlugin");
const eslintFormatter = require("react-dev-utils/eslintFormatter");
const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin");
const getClientEnvironment = require("./env");
const paths = require("./paths");

// Webpack uses `publicPath` to determine where the app is being served from.
// In development, we always serve from the root. This makes config easier.
const publicPath = "/";
// `publicUrl` is just like `publicPath`, but we will provide it to our app
// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
// Omit trailing slash as %PUBLIC_PATH%/xyz looks better than %PUBLIC_PATH%xyz.
const publicUrl = "";
// Get environment variables to inject into our app.
const env = getClientEnvironment(publicUrl);

// This is the development configuration.
// It is focused on developer experience and fast rebuilds.
// The production configuration is different and lives in a separate file.
module.exports = {
    // You may want "eval" instead if you prefer to see the compiled output in DevTools.
    // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.
    devtool: "cheap-module-source-map",
    // These are the "entry points" to our application.
    // This means they will be the "root" imports that are included in JS bundle.
    // The first two entry points enable "hot" CSS and auto-refreshes for JS.
    entry: [
        // We ship a few polyfills by default:
        require.resolve("./polyfills"),
        // Include an alternative client for WebpackDevServer. A client"s job is to
        // connect to WebpackDevServer by a socket and get notified about changes.
        // When you save a file, the client will either apply hot updates (in case
        // of CSS changes), or refresh the page (in case of JS changes). When you
        // make a syntax error, this client will display a syntax error overlay.
        // Note: instead of the default WebpackDevServer client, we use a custom one
        // to bring better experience for Create React App users. You can replace
        // the line below with these two lines if you prefer the stock client:
        // require.resolve("webpack-dev-server/client") + "?/",
        // require.resolve("webpack/hot/dev-server"),
        require.resolve("react-dev-utils/webpackHotDevClient"),
        // Finally, this is your app"s code:
        paths.appIndexJs,
        // We include the app code last so that if there is a runtime error during
        // initialization, it doesn"t blow up the WebpackDevServer client, and
        // changing JS code would still trigger a refresh.
    ],
    output: {
        // Add /* filename */ comments to generated require()s in the output.
        pathinfo: true,
        // This does not produce a real file. It"s just the virtual path that is
        // served by WebpackDevServer in development. This is the JS bundle
        // containing code from all our entry points, and the Webpack runtime.
        filename: "static/js/bundle.js",
        // There are also additional JS chunk files if you use code splitting.
        chunkFilename: "static/js/[name].chunk.js",
        // This is the URL that app is served from. We use "/" in development.
        publicPath: publicPath,
        // Point sourcemap entries to original disk location (format as URL on Windows)
        devtoolModuleFilenameTemplate: info =>
            path.resolve(info.absoluteResourcePath).replace(//g, "/"),
    },
    resolve: {
        // This allows you to set a fallback for where Webpack should look for modules.
        // We placed these paths second because we want `node_modules` to "win"
        // if there are any conflicts. This matches Node resolution mechanism.
        // https://github.com/facebookincubator/create-react-app/issues/253
        modules: ["node_modules", paths.appNodeModules].concat(
            // It is guaranteed to exist because we tweak it in `env.js`
            process.env.NODE_PATH.split(path.delimiter).filter(Boolean)
        ),
        // These are the reasonable defaults supported by the Node ecosystem.
        // We also include JSX as a common component filename extension to support
        // some tools, although we do not recommend using it, see:
        // https://github.com/facebookincubator/create-react-app/issues/290
        // `web` extension prefixes have been added for better support
        // for React Native Web.
        extensions: [".web.js", ".mjs", ".js", ".json", ".web.jsx", ".jsx"],
        alias: {

            // Support React Native Web
            // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
            "react-native": "react-native-web",
        },
        plugins: [
            // Prevents users from importing files from outside of src/ (or node_modules/).
            // This often causes confusion because we only process files within src/ with babel.
            // To fix this, we prevent you from importing files out of src/ -- if you"d like to,
            // please link the files into your node_modules/ and let module-resolution kick in.
            // Make sure your source files are compiled, as they will not be processed in any way.
            new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]),
        ],
    },
    module: {
        strictExportPresence: true,
        rules: [
            // TODO: Disable require.ensure as it"s not a standard language feature.
            // We are waiting for https://github.com/facebookincubator/create-react-app/issues/2176.
            // { parser: { requireEnsure: false } },

            // First, run the linter.
            // It"s important to do this before Babel processes the JS.
            {
                test: /.(js|jsx|mjs)$/,
                enforce: "pre",
                use: [{
                    options: {
                        formatter: eslintFormatter,
                        eslintPath: require.resolve("eslint"),

                    },
                    loader: require.resolve("eslint-loader"),
                }, ],
                include: paths.appSrc,
            },
            {
                // "oneOf" will traverse all following loaders until one will
                // match the requirements. When no loader matches it will fall
                // back to the "file" loader at the end of the loader list.
                oneOf: [
                    // "url" loader works like "file" loader except that it embeds assets
                    // smaller than specified limit in bytes as data URLs to avoid requests.
                    // A missing `test` is equivalent to a match.
                    {
                        test: [/.bmp$/, /.gif$/, /.jpe?g$/, /.png$/],
                        loader: require.resolve("url-loader"),
                        options: {
                            limit: 10000,
                            name: "static/media/[name].[hash:8].[ext]",
                        },
                    },
                    // Process JS with Babel.
                    {
                        test: /.(js|jsx|mjs)$/,
                        include: paths.appSrc,
                        loader: require.resolve("babel-loader"),
                        options: {

                            // This is a feature of `babel-loader` for webpack (not Babel itself).
                            // It enables caching results in ./node_modules/.cache/babel-loader/
                            // directory for faster rebuilds.
                            cacheDirectory: true,
                        },
                    },
                    {
                        test: /.css$/,
                        loader: "style-loader!css-loader?modules"
                    },
                    //@Lynn 这里我开启自己编写的less文件的css modules功能 除了node_modules库中的less,
                    //也就是可以过滤掉antd库中的样式
                    {
                        test: /.less$/,
                        exclude: [/node_modules/],
                        use: [
                            require.resolve("style-loader"),
                            {
                                loader: require.resolve("css-loader"),
                                options: {
                                    modules: true,
                                    localIndexName:"[name]__[local]___[hash:base64:5]"
                                },
                            },
                            {
                                loader: require.resolve("less-loader"), // compiles Less to CSS
                            },
                        ],
                    },
                    // "file" loader makes sure those assets get served by WebpackDevServer.
                    // When you `import` an asset, you get its (virtual) filename.
                    // In production, they would get copied to the `build` folder.
                    // This loader doesn"t use a "test" so it will catch all modules
                    // that fall through the other loaders.
                    {
                        // Exclude `js` files to keep "css" loader working as it injects
                        // its runtime that would otherwise processed through "file" loader.
                        // Also exclude `html` and `json` extensions so they get processed
                        // by webpacks internal loaders.
                        exclude: [/.(js|jsx|mjs)$/, /.html$/, /.json$/],
                        loader: require.resolve("file-loader"),
                        options: {
                            name: "static/media/[name].[hash:8].[ext]",
                        },
                    },
                ],
            },
            // ** STOP ** Are you adding a new loader?
            // Make sure to add the new loader(s) before the "file" loader.
        ],
    },
    plugins: [
        // extractLess,
        // Makes some environment variables available in index.html.
        // The public URL is available as %PUBLIC_URL% in index.html, e.g.:
        // 
        // In development, this will be an empty string.
        new InterpolateHtmlPlugin(env.raw),
        // Generates an `index.html` file with the 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/113622.html

相关文章

  • CSS Modules详解及React中实

    摘要:上例中打印的结果是对中的名都做了处理,使用对象来保存原和混淆后的对应关系。结合实践在处直接使用中名即可。如因为只会转变类选择器,所以这里的属性选择器不需要添加。 showImg(http://gtms01.alicdn.com/tps/i1/TB15w0HLpXXXXbdaXXXjhvsIVXX-600-364.png); CSS 是前端领域中进化最慢的一块。由于 ES2015/201...

    wemall 评论0 收藏0
  • antd-mobile按需加载样式和自定义样式

    antd-mobile 引入css的样式的两种方式 在入口处引入样式 // 一般入口文件是index.js import antd-mobile/dist/antd-mobile.css; // or antd-mobile/dist/antd-mobile.less 或者下面这种方式引入样式 和上面的方法不同的地方就是,上面是直接从包文件的路径中引入样式,这个方法是将安装包里面lib目录下的a...

    FrozenMap 评论0 收藏0
  • webpack4大结局:加入腾讯IM配置策略,实前端工程化环境极致优化

    摘要:或者的,都会对其进行分析。舒适的开发体验,有助于提高我们的开发效率,优化开发体验也至关重要组件热刷新热刷新自从推出热刷新后,前端开发者在开环境下体验大幅提高。实现热调试后,调试流程大幅缩短,和普通非直出模式调试体验保持一致。 showImg(https://segmentfault.com/img/bVbtOR3?w=1177&h=635); webpack,打包所有的资源 不知道不...

    李增田 评论0 收藏0
  • webpack4大结局:加入腾讯IM配置策略,实前端工程化环境极致优化

    摘要:或者的,都会对其进行分析。舒适的开发体验,有助于提高我们的开发效率,优化开发体验也至关重要组件热刷新热刷新自从推出热刷新后,前端开发者在开环境下体验大幅提高。实现热调试后,调试流程大幅缩短,和普通非直出模式调试体验保持一致。 showImg(https://segmentfault.com/img/bVbtOR3?w=1177&h=635); webpack,打包所有的资源 不知道不...

    stdying 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<