汇总不排除排除的包

Posted

技术标签:

【中文标题】汇总不排除排除的包【英文标题】:Rollup not excluding excluded packages 【发布时间】:2018-11-10 19:28:47 【问题描述】:

我正在使用 Rollup 来捆绑多个 React 组件。组件的样式使用styled-components。我在options.external 数组中包含了styled-componentsreact 和其他一些包。

当我将我的组件导入我的其他应用程序时,我遇到了一个错误,指出 styled-components 在页面上被实例化了两次。在我看来,这是与我的汇总配置或汇总本身有关的问题,因为在运行构建过程时我得到了一些令人困惑的输出。

汇总配置/构建文件

const babel = require('rollup-plugin-babel');
const commonjs = require('rollup-plugin-commonjs');
const nodeResolve = require('rollup-plugin-node-resolve');
const replace = require('rollup-plugin-replace');
const sass = require('rollup-plugin-sass');
const autoprefixer = require('autoprefixer');
const path = require('path');
const rollup = require('rollup');

const cwd = process.cwd();
const  name, moduleName  = require(path.join(cwd, 'package.json'));

const build = opts => 
  rollup
    .rollup(
      input: opts.input || 'src/index.js',
      external: [
        'react',
        'react-proptypes',
        'styled-components',
      ],
      output: 
        globals: 
          'react': 'React',
          'react-proptypes': 'PropTypes',
          'styled-components': 'styled',
        
      ,
      globals: 
        'react': 'React',
        'react-proptypes': 'PropTypes',
        'styled-components': 'styled',
      ,
      plugins: [
        babel(
          exclude: 'node_modules/**',
          plugins: ['external-helpers']
        ),
        sass(
          insert: false,
          output: false,
          include: '**/*.scss',
          exclude: [],
          options: 
            importer( url /*, prev */ ) 
              if ( url.startsWith( '~' ) ) 
                const path = process.cwd() + '/node_modules/' + url.slice( 1 );

                return 
                  file: path
                ;
              
            
          
        ),
        nodeResolve(
          jsnext: true
        ),
        commonjs(
          include: 'node_modules/**',
          namedExports: 
            './node_modules/react/react.js': [
              'cloneElement',
              'createElement',
              'PropTypes',
              'Children',
              'Component'
            ]
          
        ),
        replace(
          'process.env.NODE_ENV': JSON.stringify('production')
        )
      ]
    )
    .then(bundle => 
      const format = opts.format || 'umd';
      const formatMod = opts.formatMod || format;
      const exports = opts.exports || 'named';
      const dest = `dist/$name.$formatMod.js`;

      console.log(dest);
      bundle.write(
        exports,
        format,
        name: moduleName || name,
        file: dest
      );
    )
    .catch(err => 
      console.error(err);
    );
;

build(
  format: 'umd'
);

build(
  format: 'es',
  formatMod: 'esm'
);

build(
  format: 'cjs'
);

简单组件

import React from 'react';
import styled from 'styled-components';

const StyledTest = styled.div`
  font-size: 24px;
  color: red;
  font-family: sans-serif;
`;

const Test = ( children ) => (
  <StyledTest>children</StyledTest>
);

export default Test;

编译的简单组件

import React from 'react';
import styled from 'styled-components';

var taggedTemplateLiteral = function (strings, raw) 
  return Object.freeze(Object.defineProperties(strings, 
    raw: 
      value: Object.freeze(raw)
    
  ));
;

var _templateObject = taggedTemplateLiteral(['\n  font-size: 24px;\n  color: red;\n  font-family: sans-serif;\n'], ['\n  font-size: 24px;\n  color: red;\n  font-family: sans-serif;\n']);

var StyledTest = styled.div(_templateObject);

var Test = function Test(_ref) 
  var children = _ref.children;
  return React.createElement(
    StyledTest,
    null,
    children
  );
;

export default Test;

我从汇总中观察到的令人困惑的错误如下:

The following options have been renamed — please update your config: globals -> output.globals
The following options have been renamed — please update your config: globals -> output.globals
The following options have been renamed — please update your config: globals -> output.globals
dist/@vz-react/test.umd.js
dist/@vz-react/test.esm.js
dist/@vz-react/test.cjs.js
No name was provided for external module 'react' in options.globals – guessing 'React'
No name was provided for external module 'styled-components' in options.globals – guessing 'styled'

尽管定义了options.globalsoptions.output.globals,但我看到了这些错误。如果我删除 options.globals,我不再收到要求我将 options.globals 移动到 options.output.globals 的错误,但我仍然收到以下错误。

软件包版本

"rollup": "^0.59.4",
"styled-components": "^3.2.5",

【问题讨论】:

【参考方案1】:

我已经这样声明了我的外部:

const externals = 
  'react' : 'React',
  'react-dom' : 'ReactDOM',
  'react-scripts' : 'ReactScripts',
;

然后将变量的键添加到汇总配置的默认导出中。

  external: Object.keys(externals),

这应该可以帮助您摆脱警告(:

【讨论】:

【参考方案2】:

重新阅读(样式组件常见问题解答)[https://www.styled-components.com/docs/faqs#why-am-i-getting-a-warning-about-several-instances-of-module-on-the-page] 我意识到我有一个重复的styled-components 模块。

我通过在我的 webpack 配置中添加以下内容解决了这个问题:

  resolve: 
+   modules: [path.resolve(appFolder, 'node_modules'), 'node_modules'],
  

我仍然不确定为什么我会从 Rollup 收到这些警告,但样式化组件的问题不再是问题。

???

【讨论】:

以上是关于汇总不排除排除的包的主要内容,如果未能解决你的问题,请参考以下文章

maven 依赖排除 是排除低版本的还是高版本

Yarn Workspace,如何排除 node_modules 中的包文件?

从编辑器中排除包更新

在声纳中排除生成的代码

无法从代码分析中排除包

如何从数据框中排除特定的行?