意外的令牌 <Container> ,reactjs,打字稿

Posted

技术标签:

【中文标题】意外的令牌 <Container> ,reactjs,打字稿【英文标题】:Unexpected token <Container> , reactjs, typescript 【发布时间】:2021-11-10 08:48:16 【问题描述】:

收到此 tsx 代码的意外令牌错误。

我无法修复这个错误,我认为这是一个打字稿编译问题。我在下面分享了一些配置文件。我已尝试解决此问题,但找不到任何意外字符。

[ error ] ./project/app.tsx

SyntaxError: C:\Projects\project\app.tsx: Unexpected token (89:6)

  87 | 
  88 |     return (
> 89 |       <Container>

tsconfig.json 文件,


  "compileOnSave": false,
  "compilerOptions": 
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "baseUrl": ".",
    "jsx": "react",
    "lib": [
      "dom",
      "es2015",
      "es2016"
    ],
    "module": "commonjs",
    "moduleResolution": "node",
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "preserveConstEnums": true,
    "removeComments": false,
    "resolveJsonModule": true,
    "skipLibCheck": true,
    "sourceMap": true,
    "target": "es5",
    "typeRoots": [
      "./node_modules/@types"
    ]
  

package.json 文件


  "name": "@project",
  "version": "1.0",
  "author": "Author",
  "description": "project",
  "repository": 
    "type": "git",
    "url": "git@github.com:project.git"
  ,
  "main": "index.js",
  "scripts": 
    "start": "SET NODE_ENV=production ./node_modules/.bin/node .next/production-server/server/index.js",
    "build": "next build && tsc --project tsconfig.server.json && cp services.manifest.json .next/production-server",
    "build:debug": "tsc -p ./tsconfig.debug.json --pretty",
    "assets:upload": "node scripts/upload_assets.js",
    "dev": "SET NODE_ENV=dev nodemon server/index.ts",
    "lint": "tslint -c tslint.json -p tsconfig.json",
    "test": "NODE_ENV=test jest",
    "test:ci": "NODE_ENV=test JEST_JUNIT_OUTPUT_DIR=./reports jest --ci --runInBand --reporters=default --reporters=jest-junit",
    "test:watch": "NODE_ENV=test jest --watch",
    "type-check": "tsc --noEmit"
  ,
  "dependencies": 
    "@material-ui/core": "^4.7.2",
    "@material-ui/icons": "^4.5.1",
    "@zeit/next-css": "^1.0.1",
    "@zeit/next-typescript": "^1.1.1",
    "console-polyfill": "^0.3.0",
    "core-js": "^3.4.8",
    "csv-string": "^3.1.7",
    "emotion": "^9.2.12",
    "emotion-server": "^9.2.12",
    "emotion-theming": "^9.2.9",
    "isomorphic-unfetch": "^3.0.0",
    "mixpanel-browser": "^2.31.0",
    "next": "^8.1.0",
    "next-routes": "^1.4.2",
    "node": "^10.17.0",
    "nookies": "^2.0.8",
    "query-string-for-all": "^6.9.0",
    "react": "^16.12.0",
    "react-dom": "^16.12.0",
    "react-emotion": "^9.2.12",
    "react-ga": "^2.7.0",
    "react-mixpanel": "^1.0.5",
    "react-select": "^3.0.8",
    "react-window": "^1.8.5",
    "readdirp": "^3.3.0",
    "s3-sync-aws": "^1.1.1",
    "slugify": "^1.3.6"
  ,
  "devDependencies": 
    "@babel/core": "^7.7.5",
    "@babel/plugin-transform-object-assign": "^7.7.4",
    "@babel/preset-env": "^7.7.6",
    "@semantic-release/git": "^4.0.1",
    "@testing-library/jest-dom": "^4.2.4",
    "@types/isomorphic-fetch": "0.0.35",
    "@types/jest": "^24.0.23",
    "@types/next": "^8.0.7",
    "@types/react": "^16.9.16",
    "babel-jest": "^24.9.0",
    "babel-loader": "^8.0.6",
    "babel-plugin-emotion": "^9.2.11",
    "eslint": "^6.7.2",
    "eslint-config-prettier": "^6.7.0",
    "eslint-plugin-jest": "^23.1.1",
    "jest": "^24.9.0",
    "jest-cli": "^24.9.0",
    "jest-runner-prettier": "^0.3.3",
    "jest-runner-tslint": "^1.0.7",
    "nodemon": "^2.0.1",
    "prettier": "^1.19.1",
    "semantic-release": "^15.13.31",
    "ts-node": "^8.5.4",
    "tslint-config-prettier": "^1.18.0",
    "tslint-loader": "^3.5.4",
    "tslint-plugin-prettier": "^2.0.1",
    "tslint-react": "^4.1.0",
    "typescript": "^3.7.3"
  

nodemon.json


  "watch": [
    "server/*.[ts|js]"
  ],
  "execMap": 
    "ts": "ts-node"
  

.babelrc


  "env": 
    "production": 
      "presets": ["@babel/preset-env", "next/babel", "@zeit/next-typescript/babel"],
      "plugins": [
        [
          "emotion",
          
            "inline": true
          
        ],
        "@babel/plugin-transform-object-assign"
      ]
    ,
    "development": 
      "presets": ["@babel/preset-env", "next/babel", "@zeit/next-typescript/babel"],
      "plugins": [
        [
          "emotion",
          
            "sourceMap": true,
            "autoLabel": true,
            "labelFormat": "-constName--[local]"
          
        ],
        "@babel/plugin-transform-object-assign"
      ]
    ,
    "test": 
      "presets": ["@babel/preset-env", "next/babel", "@zeit/next-typescript/babel"],
      "plugins": [
        [
          "emotion",
          
            "inline": true
          
        ],
        "@babel/plugin-transform-object-assign"
      ]
    
  

_app.tsx 文件

import App,  Container  from "next/app"
import Head from "next/head"
import Router from "next/router"
import React from "react"
import mixpanel from "mixpanel-browser"
import  MixpanelProvider  from "react-mixpanel"

import  manifest as mixpanelConfig  from "../lib/utils/manifest" 
import Locale from "../lib/clients/locale"
import  initGA, logPageView  from "../lib/analytics"
import ProjectPath from "../lib/path"
import ProfileDetails from "../lib/clients/profile-details"
import  PageType  from "../lib/page-type"

// tslint:disable-next-line: no-var-requires
require("console-polyfill") // IE
mixpanel.init(mixpanelConfig.aws.mixpanel.token)

const DEFAULT_SEO = 
  title: "Title",
  description: "description", 
  twitter: 
    handle: "@acom",
    cardType: "summary",
  ,

export default class MyApp extends App 
  static async getInitialProps( Component, ctx ) 
    let pageProps = 

    await Locale.buildIndexes()
    await ProjectPath.indexTopics()

    if (Component.getInitialProps) 
      pageProps = await Component.getInitialProps(ctx)
    

    return  pageProps 
  

  async componentDidMount() 
    if (this.props.pageProps.context) 
      const trackingIDs = [
        "ADA-DA4334",
      ]
      const  publishAsRole  = this.props.pageProps.context
      switch (publishAsRole) 
        case PageType.INSIGHT_STORY:
          // rendering
          const  story  = this.props.pageProps
          if (story.teamTokens && story.teamTokens && story.teamTokens.googleAnalytics) 
            trackingIDs.push(...story.teamTokens.googleAnalytics.map(_ => _.trim()))
          
          break
        default:
          // We're rendering some content
          const  organizationSlug  = this.props.pageProps.context.path
          const organizationsObject = await ProfileDetails.getProfiles()
          const organization = organizationsObject[organizationSlug]
          if (organization && organization.teamTokens && Array.isArray(organization.teamTokens.googleAnalytics)) 
            trackingIDs.push(...organization.teamTokens.googleAnalytics.map(_ => _.trim()))
          
      
      initGA(trackingIDs)
      logPageView()
      Router.router.events.on("routeChangeComplete", logPageView)

      // On the client, we want to make sure the locale index is built before
      // user clicks to navigate away from page, as this takes a bit of time.
      await Locale.buildIndexes()
    
  

  render() 
    const  Component, pageProps  = this.props

    return (
      <Container>
        <Head>
          <meta key="twitter:card" name="twitter:card" content=DEFAULT_SEO.twitter.cardType />
          <meta key="twitter:site" name="twitter:site" content=DEFAULT_SEO.twitter.handle />
          <meta key="twitter:creator" name="twitter:creator" content=DEFAULT_SEO.twitter.handle />
          <meta key="twitter:title" name="twitter:title" content=DEFAULT_SEO.title />
          <meta key="twitter:description" name="twitter:description" content=DEFAULT_SEO.description />
          <meta key="og:url" property="og:url" content=DEFAULT_SEO.openGraph.url />
          <meta key="og:type" property="og:type" content=DEFAULT_SEO.openGraph.type />
          <meta key="og:title" property="og:title" content=DEFAULT_SEO.openGraph.title />
          <meta key="og:description" property="og:description" content=DEFAULT_SEO.openGraph.description />
          <meta key="og:image" property="og:image" content=DEFAULT_SEO.openGraph.image />
          <meta key="og:locale" property="og:locale" content=DEFAULT_SEO.openGraph.locale />
        </Head>
        <MixpanelProvider mixpanel=mixpanel>
          <Component ...pageProps />
        </MixpanelProvider>
      </Container>
    )
  

next.config.js

const deployEnv = process.env.DEPLOY_ENV || "production"

const isProd = ["production", "staging"].includes(deployEnv) || (process.ENV === "production")
const withTypescript = require("@zeit/next-typescript")
const withCSS = require("@zeit/next-css")

module.exports = withTypescript(
  withCSS(
    webpack: cfg => 
      const originalEntry = cfg.entry
      cfg.entry = async () => 
        const entries = await originalEntry()

        if (entries["main.js"] && !entries["main.js"].includes("./client/polyfills.js")) 
          entries["main.js"].unshift("./client/polyfills.js")
        

        return entries
      

      cfg.module.rules.push(
        test: /\.[jt]sx?$/,
        use: [
          
            loader: "tslint-loader",
            options: 
              isServer: false,
            ,
          ,
        ],
        exclude: /node_modules/,
      )

      return cfg
    ,
    cssLoaderOptions: 
      url: false,
    ,
    // all inside env will be available on compile time in process.env
    env: 
      deploy: deployEnv
    ,
    assetPrefix: isProd ? `https://assets.project.com/pro/$deployEnv` : "",
    poweredByHeader: false,
  ),
)

提前谢谢你。

【问题讨论】:

需要查看你的 app.tsx 这是解析器错误,请提供app.tsx的完整代码 @TR3,包含 _app.tsx 文件 尝试删除Container,只使用divFragment,看看是否也会引发错误。 我们能看到next.config.js吗? 【参考方案1】:

看到app.tsx,看起来,您正在使用next/app 之外的名为Container 的命名导入,它没有从包中导出。

下面的演示链接中解释了一个确切的场景:

https://codesandbox.io/s/next-js-forked-ucwb2?file=/index.js

【讨论】:

是的,react 包含在文件的顶部 能否提供app.tsx的完整代码 包含文件 你为什么使用 正如 next/app 在文档中所说,没有名为“Container”的导出。这是一个现场演示codesandbox.io/s/next-js-forked-ucwb2?file=/index.js【参考方案2】:

我看到你在 App 和容器中导入后正在导入 React, 你能在上面导入 React 吗? Next 在 React 之上运行。

此人的代码结构与您相似:

Receive new props in _app.js (nextjs)?

【讨论】:

以上是关于意外的令牌 <Container> ,reactjs,打字稿的主要内容,如果未能解决你的问题,请参考以下文章

如何修复意外令牌“/”的 ESLint 解析错误?

eslint“解析错误:JSX中的意外令牌”

HTML1506:意外的令牌 <script>

JSONP 意外令牌 <

解析错误:由“<!DOCTYPE html>”引起的意外令牌更漂亮/更漂亮

未捕获的SyntaxError:无效或意外的令牌