为 IE 10/11 转译 NextJS; 'Weakset undefined'
Transpiling NextJS for IE 10/11; 'Weakset undefined'
我有一个正在构建的 NextJS 网站,它很棒,但它在 IE 10/11 中不起作用,因为某些代码未正确转译。我对 babel 和 webpack 真的很不好,以前从来没有自己配置过它们。我这两天一直在尝试通过在线阅读来解决问题,但似乎对我没有任何帮助。
我得到的确切错误是 weakSet is not defined
,它来自 common.js 文件。
这是我的 .babelrc 文件,位于我项目的根目录中。
//.babelrc
{
"presets": ["next/babel"],
"plugins": [
["styled-components", {
"ssr": true,
"displayName": true,
"preprocess": false
}]
]
}
我的package.json
{
"name": "bradshouse",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "next",
"build": "next build",
"start": "next start"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"next": "^7.0.2",
"react": "^16.6.0",
"react-dom": "^16.6.0",
"react-pose": "^4.0.1",
"styled-components": "^4.0.2"
},
"devDependencies": {
"babel-plugin-styled-components": "^1.8.0"
}
}
如果您有兴趣自己启动它,可以在此处查看完整的存储库。节点模块被排除在外,所以 npm install,然后 npm 运行 build,然后 npm 运行 start.
https://github.com/TJBlackman/Brads-House
感谢您的帮助!欢迎阅读 link 篇文章,我会仔细阅读的!谢谢。
编辑: 作为快速修复,我将这个 polyfill 脚本添加到我所有页面的 <head>
,但它仍然没有解决这个问题......哇?! <script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>
如何通过在 NextJS 中转译 node_modules 代码来支持 IE 11
在 ziet/nextjs 问题线程中找到的原始答案 (view here). Shout out to joaovieira <3
npm install --save-dev babel-polyfill
在任何你想要的地方创建一个 polyfill.js
,然后在该文件中导入 babel-polyfill
,如下所示:
import 'babel-polyfill';
接下来,如果您没有 next.config.js
文件,请在您的根目录中创建它。现在更新您的此文件以包含以下 webpack 配置。请注意它是如何使用您刚刚创建的 polyfill 文件的。完整文件示例:
module.exports = {
webpack: (config) => {
// Unshift polyfills in main entrypoint.
const originalEntry = config.entry;
config.entry = async () => {
const entries = await originalEntry();
if (entries['main.js']) {
entries['main.js'].unshift('./path_to/polyfills.js'); // <- polyfill here
}
return entries;
};
return config;
}
}
最后,如果您的项目根目录中没有 .babelrc
文件,请创建一个。在其中,使用下面与您正在使用的 babel 版本相匹配的代码。
通天塔 7
{
"presets": [
[
"next/babel",
{
"preset-env": {
"useBuiltIns": "usage"
}
}
]
]
}
巴别塔 6
{
"presets": [
[
"next/babel",
{
"preset-env": {
"targets": {
"browsers": "defaults"
},
"useBuiltIns": true
}
}
]
]
}
这就是我所知道的。我什至没有考虑 IE 10...
祝你好运!!
我正在使用 next@9.3
和 reflect-metadata
,这是我的解决方案:
/** next.config.js > webpack **/
const pathToPolyfills = './src/polyfills.js'
// Fix [TypeError: Reflect.metadata is not a function] during production build
// Thanks to https://leerob.io/blog/things-ive-learned-building-nextjs-apps#polyfills
// There is an official example as well: https://git.io/JfqUF
const originalEntry = config.entry
config.entry = async () => {
const entries = await originalEntry()
Object.keys(entries).forEach(pageBundleEntryJs => {
let sourceFilesIncluded = entries[pageBundleEntryJs]
if (!Array.isArray(sourceFilesIncluded)) {
sourceFilesIncluded = entries[pageBundleEntryJs] = [sourceFilesIncluded]
}
if (!sourceFilesIncluded.some(file => file.includes('polyfills'))) {
sourceFilesIncluded.unshift(pathToPolyfills)
}
})
return entries
}
/** src/polyfills.js **/
// Other polyfills ...
import 'reflect-metadata'
我有一个正在构建的 NextJS 网站,它很棒,但它在 IE 10/11 中不起作用,因为某些代码未正确转译。我对 babel 和 webpack 真的很不好,以前从来没有自己配置过它们。我这两天一直在尝试通过在线阅读来解决问题,但似乎对我没有任何帮助。
我得到的确切错误是 weakSet is not defined
,它来自 common.js 文件。
这是我的 .babelrc 文件,位于我项目的根目录中。
//.babelrc
{
"presets": ["next/babel"],
"plugins": [
["styled-components", {
"ssr": true,
"displayName": true,
"preprocess": false
}]
]
}
我的package.json
{
"name": "bradshouse",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "next",
"build": "next build",
"start": "next start"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"next": "^7.0.2",
"react": "^16.6.0",
"react-dom": "^16.6.0",
"react-pose": "^4.0.1",
"styled-components": "^4.0.2"
},
"devDependencies": {
"babel-plugin-styled-components": "^1.8.0"
}
}
如果您有兴趣自己启动它,可以在此处查看完整的存储库。节点模块被排除在外,所以 npm install,然后 npm 运行 build,然后 npm 运行 start.
https://github.com/TJBlackman/Brads-House
感谢您的帮助!欢迎阅读 link 篇文章,我会仔细阅读的!谢谢。
编辑: 作为快速修复,我将这个 polyfill 脚本添加到我所有页面的 <head>
,但它仍然没有解决这个问题......哇?! <script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>
如何通过在 NextJS 中转译 node_modules 代码来支持 IE 11
在 ziet/nextjs 问题线程中找到的原始答案 (view here). Shout out to joaovieira <3
npm install --save-dev babel-polyfill
在任何你想要的地方创建一个 polyfill.js
,然后在该文件中导入 babel-polyfill
,如下所示:
import 'babel-polyfill';
接下来,如果您没有 next.config.js
文件,请在您的根目录中创建它。现在更新您的此文件以包含以下 webpack 配置。请注意它是如何使用您刚刚创建的 polyfill 文件的。完整文件示例:
module.exports = {
webpack: (config) => {
// Unshift polyfills in main entrypoint.
const originalEntry = config.entry;
config.entry = async () => {
const entries = await originalEntry();
if (entries['main.js']) {
entries['main.js'].unshift('./path_to/polyfills.js'); // <- polyfill here
}
return entries;
};
return config;
}
}
最后,如果您的项目根目录中没有 .babelrc
文件,请创建一个。在其中,使用下面与您正在使用的 babel 版本相匹配的代码。
通天塔 7
{
"presets": [
[
"next/babel",
{
"preset-env": {
"useBuiltIns": "usage"
}
}
]
]
}
巴别塔 6
{
"presets": [
[
"next/babel",
{
"preset-env": {
"targets": {
"browsers": "defaults"
},
"useBuiltIns": true
}
}
]
]
}
这就是我所知道的。我什至没有考虑 IE 10...
祝你好运!!
我正在使用 next@9.3
和 reflect-metadata
,这是我的解决方案:
/** next.config.js > webpack **/
const pathToPolyfills = './src/polyfills.js'
// Fix [TypeError: Reflect.metadata is not a function] during production build
// Thanks to https://leerob.io/blog/things-ive-learned-building-nextjs-apps#polyfills
// There is an official example as well: https://git.io/JfqUF
const originalEntry = config.entry
config.entry = async () => {
const entries = await originalEntry()
Object.keys(entries).forEach(pageBundleEntryJs => {
let sourceFilesIncluded = entries[pageBundleEntryJs]
if (!Array.isArray(sourceFilesIncluded)) {
sourceFilesIncluded = entries[pageBundleEntryJs] = [sourceFilesIncluded]
}
if (!sourceFilesIncluded.some(file => file.includes('polyfills'))) {
sourceFilesIncluded.unshift(pathToPolyfills)
}
})
return entries
}
/** src/polyfills.js **/
// Other polyfills ...
import 'reflect-metadata'