Server components: Can we use webpack to add "use client" in modules from compponent library?

huangapple go评论72阅读模式
英文:

Server components: Can we use webpack to add "use client" in modules from compponent library?

问题

React 服务器组件使我们在文件顶部使用“use client”指令。这基本上破坏了React组件库(如ReactBootstrap和PrimeReact),并迫使我们创建包装文件,只是为了在此库导出的每个模块中添加“use client”。但是否有一些Webpack功能可以用来自动在这种类型的库中为我们添加这个“use client”呢?

英文:

React server components make us use the "use client" directive on top of files. This basically breaks react components library (like ReactBootstrap and PrimeReact) and makes us create wrapper files just to add "use client" in each module exported by this lib. But is there some Webpack feature that we can use to add this "use client" for us in that kind of library?

答案1

得分: 3

// loaders/use-client-loader.js

module.exports = function (source) {
  return `"使用客户端";\n` + source;
};


//现在在webpack中声明加载器

/// 如果你在使用nextJS:
/// next.config.js

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: function (config, options) {
    config.module.rules.push({
      test: [/node_modules[\\/]primereact[\\/.].*\.js$/], /// 替换这里以匹配你的包
      loader: require.resolve("./loaders/use-client-loader.js"),
    });
    return config;
  },
};

module.exports = nextConfig;

// 如果你没有使用nextJS(找到如何编辑你的webpack配置):
module.exports = {
  // ...一些配置在这里
  module: {
    rules: {
      test: [/node_modules[\\/]primereact[\\/.].*\.js$/], /// 替换这里以匹配你的包
      loader: require.resolve("./loaders/use-client-loader.js"),
    },
  },
};
英文:

I figured out that it is actually pretty easy to do this. You just need to define a Webpack loader to do that:

// loaders/use-client-loader.js

module.exports = function (source) {
  return `"use client";\n` + source;
};


//Now declare the loader in webpack

/// if you are using with nextJS:
/// next.config.js

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: function (config, options) {
    config.module.rules.push({
      test: [/node_modules[\\/]primereact[\\/.].*\.js$/], /// replace here make match your package
      loader: require.resolve("./loaders/use-client-loader.js"),
    });
    return config;
  },
};

module.exports = nextConfig;

// if you are not using nextJS (find how to edit your webpack config):
module.exports = {
  // ...some config here
  module: {
    rules: {
      test: [/node_modules[\\/]primereact[\\/.].*\.js$/], /// replace here make match your package
      loader: require.resolve("./loaders/use-client-loader.js"),
    },
  },
};

huangapple
  • 本文由 发表于 2023年6月8日 22:09:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/76432728.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定