Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
CoCo_Code_Op2
next.js
提交
6d71eef5
N
next.js
项目概览
CoCo_Code_Op2
/
next.js
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
N
next.js
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
6d71eef5
编写于
8月 10, 2020
作者:
J
Joe Haddad
提交者:
GitHub
8月 10, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Do not assign to readonly property in Safari (#16051)
上级
4a04212d
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
77 addition
and
10 deletion
+77
-10
packages/next/client/page-loader.js
packages/next/client/page-loader.js
+6
-8
packages/next/next-server/lib/router/router.ts
packages/next/next-server/lib/router/router.ts
+7
-2
test/integration/production/next.config.js
test/integration/production/next.config.js
+10
-0
test/integration/production/pages/shadowed-page.js
test/integration/production/pages/shadowed-page.js
+7
-0
test/integration/production/pages/to-nonexistent.js
test/integration/production/pages/to-nonexistent.js
+11
-0
test/integration/production/pages/to-shadowed-page.js
test/integration/production/pages/to-shadowed-page.js
+11
-0
test/integration/production/test/index.test.js
test/integration/production/test/index.test.js
+25
-0
未找到文件。
packages/next/client/page-loader.js
浏览文件 @
6d71eef5
import
mitt
from
'
../next-server/lib/mitt
'
import
{
addBasePath
,
markLoadingError
}
from
'
../next-server/lib/router/router
'
import
escapePathDelimiters
from
'
../next-server/lib/router/utils/escape-path-delimiters
'
import
getAssetPathFromRoute
from
'
./../next-server/lib/router/utils/get-asset-path-from-route
'
import
{
isDynamicRoute
}
from
'
./../next-server/lib/router/utils/is-dynamic
'
import
{
parseRelativeUrl
}
from
'
./../next-server/lib/router/utils/parse-relative-url
'
import
{
searchParamsToUrlQuery
}
from
'
./../next-server/lib/router/utils/querystring
'
import
{
getRouteMatcher
}
from
'
./../next-server/lib/router/utils/route-matcher
'
import
{
getRouteRegex
}
from
'
./../next-server/lib/router/utils/route-regex
'
import
{
searchParamsToUrlQuery
}
from
'
./../next-server/lib/router/utils/querystring
'
import
{
parseRelativeUrl
}
from
'
./../next-server/lib/router/utils/parse-relative-url
'
import
escapePathDelimiters
from
'
../next-server/lib/router/utils/escape-path-delimiters
'
import
getAssetPathFromRoute
from
'
./../next-server/lib/router/utils/get-asset-path-from-route
'
import
{
addBasePath
}
from
'
../next-server/lib/router/router
'
function
hasRel
(
rel
,
link
)
{
try
{
...
...
@@ -16,9 +16,7 @@ function hasRel(rel, link) {
}
function
pageLoadError
(
route
)
{
const
error
=
new
Error
(
`Error loading
${
route
}
`
)
error
.
code
=
'
PAGE_LOAD_ERROR
'
return
error
return
markLoadingError
(
new
Error
(
`Error loading
${
route
}
`
))
}
const
relPrefetch
=
...
...
packages/next/next-server/lib/router/router.ts
浏览文件 @
6d71eef5
...
...
@@ -98,6 +98,11 @@ export function resolveHref(currentPath: string, href: Url): string {
}
}
const
PAGE_LOAD_ERROR
=
Symbol
(
'
PAGE_LOAD_ERROR
'
)
export
function
markLoadingError
(
err
:
Error
):
Error
{
return
Object
.
defineProperty
(
err
,
PAGE_LOAD_ERROR
,
{})
}
function
prepareUrlAs
(
router
:
NextRouter
,
url
:
Url
,
as
:
Url
)
{
// If url and as provided as an object representation,
// we'll format them into the string version here.
...
...
@@ -205,7 +210,7 @@ function fetchNextData(dataHref: string, isServerRender: boolean) {
// on a client-side transition. Otherwise, we'd get into an infinite
// loop.
if
(
!
isServerRender
)
{
;(
err
as
any
).
code
=
'
PAGE_LOAD_ERROR
'
markLoadingError
(
err
)
}
throw
err
})
...
...
@@ -641,7 +646,7 @@ export default class Router implements BaseRouter {
throw
err
}
if
(
err
.
code
===
'
PAGE_LOAD_ERROR
'
||
loadErrorFail
)
{
if
(
PAGE_LOAD_ERROR
in
err
||
loadErrorFail
)
{
Router
.
events
.
emit
(
'
routeChangeError
'
,
err
,
as
)
// If we can't load the page it could be one of following reasons
...
...
test/integration/production/next.config.js
浏览文件 @
6d71eef5
...
...
@@ -10,6 +10,16 @@ module.exports = {
destination
:
'
/:lang/about
'
,
permanent
:
false
,
},
{
source
:
'
/nonexistent
'
,
destination
:
'
/about
'
,
permanent
:
false
,
},
{
source
:
'
/shadowed-page
'
,
destination
:
'
/about
'
,
permanent
:
false
,
},
]
},
}
test/integration/production/pages/shadowed-page.js
0 → 100644
浏览文件 @
6d71eef5
export
function
getServerSideProps
()
{
throw
new
Error
(
'
oops!
'
)
}
export
default
function
ShadowedPage
()
{
return
<
div
id
=
"
shadowed-page
"
>
Not
routable
!<
/div
>
}
test/integration/production/pages/to-nonexistent.js
0 → 100644
浏览文件 @
6d71eef5
import
Link
from
'
next/link
'
export
default
function
ToNonexistent
()
{
return
(
<
div
id
=
"
blackhole-page
"
>
<
Link
href
=
"
/nonexistent
"
>
<
a
id
=
"
to-nonexistent-page
"
>
Nonexistent
Page
<
/a
>
<
/Link
>
<
/div
>
)
}
test/integration/production/pages/to-shadowed-page.js
0 → 100644
浏览文件 @
6d71eef5
import
Link
from
'
next/link
'
export
default
function
ToShadowed
()
{
return
(
<
div
id
=
"
shadowed-page-gateway
"
>
<
Link
href
=
"
/shadowed-page
"
>
<
a
id
=
"
to-shadowed-page
"
>
Shadowed
Page
<
/a
>
<
/Link
>
<
/div
>
)
}
test/integration/production/test/index.test.js
浏览文件 @
6d71eef5
...
...
@@ -373,6 +373,31 @@ describe('Production Usage', () => {
expect
(
title
).
toBe
(
'
hello from title
'
)
expect
(
url
).
toBe
(
'
/with-title
'
)
})
it
(
'
should reload page successfully (on bad link)
'
,
async
()
=>
{
const
browser
=
await
webdriver
(
appPort
,
'
/to-nonexistent
'
)
await
browser
.
eval
(
function
setup
()
{
window
.
__DATA_BE_GONE
=
'
true
'
})
await
browser
.
waitForElementByCss
(
'
#to-nonexistent-page
'
)
await
browser
.
click
(
'
#to-nonexistent-page
'
)
await
browser
.
waitForElementByCss
(
'
.about-page
'
)
const
oldData
=
await
browser
.
eval
(
`window.__DATA_BE_GONE`
)
expect
(
oldData
).
toBeFalsy
()
})
it
(
'
should reload page successfully (on bad data fetch)
'
,
async
()
=>
{
const
browser
=
await
webdriver
(
appPort
,
'
/to-shadowed-page
'
)
await
browser
.
eval
(
function
setup
()
{
window
.
__DATA_BE_GONE
=
'
true
'
})
await
browser
.
waitForElementByCss
(
'
#to-shadowed-page
'
).
click
()
await
browser
.
waitForElementByCss
(
'
.about-page
'
)
const
oldData
=
await
browser
.
eval
(
`window.__DATA_BE_GONE`
)
expect
(
oldData
).
toBeFalsy
()
})
})
it
(
'
should navigate to external site and back
'
,
async
()
=>
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录