Синтаксическая ошибка Typescript в модуле CommonJS / Node: неожиданный токен ':' в параметре функции - PullRequest
0 голосов
/ 02 августа 2020

Этот файл проверяется как действительный через TS, ошибок больше нет, но во время выполнения я получаю Неожиданный токен ':' на любом из указанных мной TS, например, он немедленно вызывает ошибки на function (err: string)

Здесь это мои сценарии сборки и запуска. Я, конечно, запускаю сборку, затем запускаю start:

"start": "node  --trace-warnings dist/server.ts",
"build": "NODE_ENV=production webpack -p --env=prod",

api.ts

const _ = require('lodash'),
  companyTable = require('./shared/data/companies.json'),
  countryTable = require('./shared/data/countries.json'),
  compression = require('compression'),
  express = require('express'),
  expressApp = (module.exports = express()),
  historyApi = require('connect-history-api-fallback'),
  oneYear = 31536000;

expressApp.use(compression());

module.exports = expressApp
  .on('error', function (err: string) {
    console.log(err);
  })
  .get('/api/v1/countries', (res: any) => {
    res.json(
      countryTable.map((country: any) => {
        return _.pick(country, ['id', 'name', 'images']);
      })
    );
  })

server.ts

const app = require('./api.js');

const cluster = require('cluster'),
  os = require('os'),
  port = process.env.PORT || 8080;

console.log(port);

if (cluster.isMaster) {
  for (let i = 0; i < os.cpus().length; i++) {
    cluster.fork();
  }
  console.log('Ready on port %d', port);
} else {
  app.listen(port, (err: string) => {
    console.log(`express is listening on port ${port}`);
    if (err) {
      console.log('server startup error');
      console.log(err);
    }
  });
}

tsconfig. json

{
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */
    "target": "es6",                     /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
    "module": "es6",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
    "lib": ["es6"],                      /* Specify library files to be included in the compilation. */
    "moduleResolution": "node",
    "allowJs": true,                     /* Allow javascript files to be compiled. */
    "checkJs": true,                     /* Report errors in .js files. */
    "jsx": "react",
    "noImplicitAny": true,
    "sourceMap": true,                   /* Generates corresponding '.map' file. */
    "outDir": "dist",                   /* Redirect output structure to the directory. */
    "rootDir": "./",                     /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    "removeComments": true,              /* Do not emit comments to output. */
    "strict": true,                      /* Enable all strict type-checking options. */
    "noUnusedLocals": true,                /* Report errors on unused locals. */
    "noUnusedParameters": true,            /* Report errors on unused parameters. */
//    "rootDirs": ["."],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    "typeRoots": [
      "node_modules/@types"
    ],                      /* List of folders to include type definitions from. */
    "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
    "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
//      "resolveJsonModule": true,
    "skipLibCheck": true,                     /* Skip type checking of declaration files. */
    "forceConsistentCasingInFileNames": true
    },
    "include": [
        "src"
    ],
    "exclude": [
        "/node_modules",
        "/src/client/js/ink-config.js",
        "**/test"
  ]
}

введите описание изображения здесь

ОБНОВЛЕНИЕ

Итак, кто-то указал на очевидное. Спрашивая, почему в моем dist есть файл .ts (server.ts) и api.ts. Это потому, что я копирую его в свой webpack.config. js:

const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const TerserJSPlugin = require('terser-webpack-plugin');
const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const CopyPlugin = require('copy-webpack-plugin');

const isProduction = process.env.NODE_ENV === 'production';

const html = () => {
  return new HtmlWebPackPlugin({
    template: path.resolve(__dirname, 'src/client', 'index.html'),
    filename: 'index.html',
    hash: true,
  });
};

const copyAllOtherDistFiles = () => {
  return new CopyPlugin({
    patterns: [
      { from: 'src/client/assets', to: 'lib/assets' },
      { from: 'src/server.ts', to: './' },
      { from: 'src/api.ts', to: './' },
      { from: 'package.json', to: './' },
      { from: 'ext/ink-3.1.10/js/ink-all.min.js', to: 'lib/js' },
      { from: 'ext/ink-3.1.10/js/autoload.min.js', to: 'lib/js' },
      { from: 'ext/js/jquery-2.2.3.min.js', to: 'lib/js' },
      { from: 'ext/ink-3.1.10/css/ink.min.css', to: 'lib/css/ink.min.css' },
      { from: 'feed.xml', to: './' },
      {
        from: 'src/shared',
        to: './shared',
        globOptions: {
          ignore: ['**/*suppressed.json'],
        },
      },
    ],
  });
};

module.exports = {
  entry: './src/client/index.tsx',
  output: {
    filename: 'scripts/app.[hash].bundle.js',
    publicPath: '/',
    path: path.resolve(__dirname, 'dist'),
  },
  resolve: {
    extensions: ['.ts', '.tsx', '.js'],
  },
  devtool: 'inline-source-map',
  devServer: {
    writeToDisk: true,
    port: 8080,
  },
  optimization: {
    minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
    splitChunks: {
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.css$/,
          chunks: 'all',
          enforce: true,
        },
      },
    },
  },
  module: {
    rules: [
      {
        test: /\.(js)$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
        },
      },
      {
        test: /\.(tsx|ts)?$/,
        use: 'ts-loader',
        exclude: /node_modules/,
      },
      {
        test: /\.html$/,
        use: [
          {
            loader: 'html-loader',
          },
        ],
      },
      {
        test: /\.less$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader'],
      },
      {
        test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              hmr: process.env.NODE_ENV === 'development',
            },
          },
          'css-loader',
        ],
      },
      {
        test: /\.(woff|woff2|eot|ttf|otf)$/,
        loader: 'file-loader',
        options: {
          outputPath: 'lib/assets/fonts',
        },
      },
      {
        test: /\.(png|svg|jpg|gif)$/,
        use: ['url-loader'],
      },
    ],
  },
  plugins: isProduction
    ? [
        new CleanWebpackPlugin(),
        new MiniCssExtractPlugin({
          filename: isProduction ? 'lib/css/main.[hash].css' : 'main.css',
        }),
        html(),
        copyAllOtherDistFiles(),
      ]
    : [new CleanWebpackPlugin(), html(), copyAllOtherDistFiles()],
};

Итак ... Мне нужно сделать что-то другое. Хотя мне действительно нужны server.ts и api.ts во время разработки, я не знаю, как я могу транспилировать, а затем скопировать эти два файла (помимо создаваемого мной веб-пакета).

1 Ответ

2 голосов
/ 02 августа 2020

Итак, я не совсем уверен, каков вариант использования прямого копирования файлов, но позвольте мне ответить, указав, как вы можете добиться наличия транспилированных файлов в выходном каталоге, по-прежнему используя исходный .ts источник файл в разработке:

Во-первых, вы можете использовать ts-node-dev в разработке, что помогает вам запускать исходные исходные файлы путем транспилирования на лету, чтобы вы могли использовать его так же, как и используйте двоичный файл node, но в исходных файлах, а не в отправленных файлах. Я использую команду, подобную этой для разработки: NODE_ENV=development ts-node-dev --watch ./src/server.ts --transpileOnly ./src/server.ts

Затем, для производства, при условии, что вы не укажете параметр noEmit в параметрах компилятора, TypeScript будет транспилировать и передавать файлы в предоставленные outDir. Итак, вы можете запускать эти созданные файлы, используя двоичный файл узла: NODE_ENV=production node ./dist/server.js. Это позволит вам удалить файлы в исходном каталоге из вашего плагина копирования, так как TypeScript будет преобразовывать и генерировать транспилированный js в каталоге для вас

Edit (из комментариев) : Чтобы включить только те файлы, которые вы хотите передать, вы можете указать их в include в вашем tsconfig: include: ['./src/api.ts', './src/server.ts']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...