如何在reactjs中删除导入的css

Vis*_*nan 7 javascript css import reactjs redux

我已经使用以下代码导入 css

componentWillMount() {
    import('./patient-summary.css');
}
Run Code Online (Sandbox Code Playgroud)

未使用组件时如何从 react 中删除导入的 css。当我回到上一个屏幕时,这个 css 会在那里应用。任何的想法 ?

更新:: Webpack 配置

const path = require('path');
const webpack = require('webpack');

module.exports = {
  entry: './src/index.js',
  output: {
  filename: 'bundle.js',
  path: path.resolve(__dirname, 'public/dist')
},
module: {
  rules: [
      {
          test: /\.js?$/, 
          loader: 'babel-loader',
          exclude: /node_modules/
      },
      {
          test: /\.css$/,
          use: [ 'style-loader', 'css-loader' ]
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        loader: "file-loader"
      }
      ,
      {
        test: /\.(png|jpeg|jpg|gif|svg)$/,
        loader: "file-loader"
      }
  ]
  },
  devServer: {
  contentBase: path.resolve(__dirname, "public"),
  historyApiFallback: true,
  port: 3000,
  watchOptions: {
    // Delay the rebuild after the first change
    aggregateTimeout: 300,

    // Poll using interval (in ms, accepts boolean too)
    poll: 1000,
  },
  },
  plugins: [
   // Ignore node_modules so CPU usage with poll
   // watching drops significantly.
   new webpack.WatchIgnorePlugin([
      path.join(__dirname, "node_modules")
   ])
 ],
 };
Run Code Online (Sandbox Code Playgroud)

Jam*_*ord 6

我在 React 中找到了一种(某种程度上)合理的方法来做到这一点。简而言之,您可以延迟加载包含 的React 组件import './style.css',并且在加载时,您可以捕获导入的StyleSheet以稍后切换其StyleSheet.disabled属性。

这是主要代码,下面有更多解释。这是我的要点

useDisableImportedStyles.tsx

import { useEffect } from 'react'

// global list of all the StyleSheets that are touched in useDisableImportedStyles
const switchableGlobalStyleSheets: StyleSheet[] = []

// just to clarify what createUseDisableImportedStyles() returns
type useDisableImportedStyles = () => void

export const createUseDisableImportedStyles = (
    immediatelyUnloadStyle: boolean = true
    // if true: immediately unloads the StyleSheet when the component is unmounted
    // if false: waits to unloads the StyleSheet until another instance of useDisableImportedStyles is called.This avoids a flash of unstyled content
): useDisableImportedStyles => {
    let localStyleSheet: StyleSheet
    return () => {
        useEffect(() => {

            // if there are no stylesheets, you did something wrong...
            if (document.styleSheets.length < 1) return

            // set the localStyleSheet if this is the first time this instance of this useEffect is called
            if (localStyleSheet == null) {
                localStyleSheet = document.styleSheets[document.styleSheets.length - 1]
                switchableGlobalStyleSheets.push(localStyleSheet)
            }

            // if we are switching StyleSheets, disable all switchableGlobalStyleSheets
            if (!immediatelyUnloadStyle) {
                switchableGlobalStyleSheets.forEach(styleSheet => styleSheet.disabled = true)
            }

            // enable our StyleSheet!
            localStyleSheet.disabled = false

            // if we are NOT switching StyleSheets, disable this StyleSheet when the component is unmounted
            if (immediatelyUnloadStyle) return () => {
                if (localStyleSheet != null) localStyleSheet.disabled = true
            }

        })
    }
}
Run Code Online (Sandbox Code Playgroud)

警告:这非常挑剔。您必须准确设置此项,否则可能会出现意想不到的后果

状况:

  1. createUseDisableImportedStyles必须在同一 tsx 文件中的全局范围内调用作为目标导入的 css 和要延迟加载的组件
import React from 'react'
import { createUseDisableImportedStyles } from './useDisableImportedStyles'
import './global-styles.css'
const useDisableImportedStyles = createUseDisableImportedStyles()
export const CssComponent: React.FC<{}> = () => {
    useDisableImportedStyles()
    return null
}
export default CssComponent
Run Code Online (Sandbox Code Playgroud)
  1. 使用此钩子的组件应该是延迟加载的:
LazyCssComponent = React.lazy(() => import('./cssComponent'))
...
<React.Suspense fallback={<></>}>
    {condition && <LazyCssComponent/>}
</React.Suspense>
Run Code Online (Sandbox Code Playgroud)
  1. 延迟加载的一个例外可能是在单个正常的非延迟组件中使用它,因此样式在第一次渲染时加载
  • 注意:InitialCssComponent永远不需要实际渲染,只需要导入
  • 但是:只有在全局导入一个.css 文件时,这才有效,否则,我不知道会发生什么
import InitialCssComponent  from './initialCssComponent'
LazyCssComponent = React.lazy(() => import('./cssComponent'))
//...
{false && <InitialCssComponent/>}
<React.Suspense fallback={<></>}>
    {condition && <LazyCssComponent/>}
</React.Suspense>
Run Code Online (Sandbox Code Playgroud)

祝你好运!


ora*_*bis 1

首先,据我所知,您不应该在 componentWillMount 中调用任何导入。这意味着每次要安装新组件时,都会一遍又一遍地加载此 css。相反,它必须放置在模块的开头。

避免不必要的 css 导入的方法就是避免不必要的组件导入。因此,如果你的组件没有在任何地方被调用,那么这个 css 将不会被加载。

对于路由,我认为您需要进行一些代码分割,但我不确定这是否简单或正确的方法。

链接 1 链接 2

  • 谢谢(你的)信息 。我已经把代码分开了。但是,如果添加了 css,如果我返回到上一个屏幕,它会受到稍后添加的 css 的影响 (4认同)