在ASP.NET Core 2.0 React(TypeScript)项目中配置Rollup遇toASCII导出错误
解决Rollup中'toASCII' is not exported by punycode.js的错误
这个错误的核心原因很明确:rollup-plugin-node-builtins里的url.js尝试从punycode包导入命名导出的toASCII,但实际上punycode是通过默认导出整个模块的,并没有暴露单独的toASCII命名导出,所以Rollup找不到这个导出项。
结合你的配置,我整理了几个可行的修复步骤:
1. 在commonjs插件中手动映射punycode的命名导出
Rollup的commonjs插件允许我们手动指定CommonJS模块的命名导出映射,针对punycode,我们可以把它的方法映射成Rollup能识别的命名导出。修改你的commonjs配置,在namedExports里添加:
'node_modules/punycode/punycode.js': ['toASCII', 'toUnicode']
2. 移除重复的resolve插件
你的配置里同时引入了resolve()和nodeResolve({...}),这两个其实是同一个插件(rollup-plugin-node-resolve),重复引入可能导致不必要的冲突,建议只保留带有配置项的那一个,删掉单独的resolve()。
3. 修正external配置的模块名大小写
你当前的external里写的是'React'、'ReactDOM',但Node.js的模块名是区分大小写的,实际的包名是小写的react、react-dom,修正后能避免Rollup误判这些模块为外部依赖。
修改后的完整rollup.config.js
import typescript from 'rollup-plugin-typescript2'; import lessModules from 'rollup-plugin-less-modules'; import nodeResolve from 'rollup-plugin-node-resolve'; import commonjs from 'rollup-plugin-commonjs'; import json from 'rollup-plugin-json'; import builtins from 'rollup-plugin-node-builtins'; import globals from 'rollup-plugin-node-globals'; export default { plugins: [ typescript(), nodeResolve({ jsnext: true, main: true, browser: true }), commonjs({ include: [ 'node_modules/**' ], exclude: [ 'node_modules/process-es6/**' ], namedExports: { 'node_modules/react/react.js': ['Children', 'Component', 'PropTypes', 'createElement'], 'node_modules/react-dom/index.js': ['render'], 'node_modules/punycode/punycode.js': ['toASCII', 'toUnicode'] } }), builtins(), globals(), json(), lessModules({output: true}) ], input: './ClientApp/boot.tsx', output: { file: './wwwroot/dist/bundle.js', format: 'iife' }, external: [ 'react', 'react-dom', 'react-router-dom' ], sourceMap: true }
做完这些修改后,再运行rollup -c应该就能解决这个导出错误了。另外你已经手动安装过punycode,这步没问题,不需要再重复安装。
内容的提问来源于stack exchange,提问作者Dmitrij Polyanin
相关产品推荐
相关产品推荐

