Как выбрать NOD_modules дистрибутив в комплекте с веб-пакетом - PullRequest
0 голосов
/ 16 мая 2018

Проблема:

После того, как я обновил AJV.js до Версии 6.4, мой комплект поставки включает версию ESNEXT "uri-js" вместо версии ES5, что нарушает совместимость IE11.

Анализ:

Я подумал, что этот AJV ссылается на uri-js с помощью вызова require('uri-js') и что uri-js поставляется в двух вариантах:

/node_modules/uri-js/dist/:

  • ES5
  • esnext

По какой-то причине Webpack (V 4.8) связывает «esnext» вариант uri-js в мой пакет поставщика вместо использования «es5». Я не смог найти, как / где я должен указать, что моя предпочтительная цель сборки:

Вот мой webpack.config.js:

const path = require("path");
const webpack = require("webpack");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
    entry: {
        app: './src/index.tsx'
    },
    output: {
        filename: "js/[name].bundle.js",
        path: __dirname + "/dist"
    },
    devtool: "source-map",
    resolve: {
        extensions: [".ts", ".tsx", ".js", ".jsx", ".json"]
    },
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                loader: "ts-loader"
            },
            {
                test: /\.less$/,
                use: ExtractTextPlugin.extract({
                    use: [{
                        loader: "css-loader",
                        options: {
                            localIdentName: '[local]--[hash:5]',
                            sourceMap: true
                        }

                    }, {
                        loader: "less-loader",
                        options: {
                            sourceMap: true
                        }
                    }],
                    fallback: "style-loader",
                    publicPath: "../"
                }),
                exclude: "/node_modules/"
            },
            {
                test: /\.html$/,
                use: 'raw-loader'
            },
            {
                test: /\.jpe?g$|\.gif$|\.png$/i,
                loader: "file-loader?name=assets/img/[name].[ext]"
            },
            {
                test: /\.woff2?$|\.ttf$|\.eot$|\.svg$/,
                use: "file-loader?name=assets/[name].[ext]"
            }
        ]
    },
    plugins: [
        new ExtractTextPlugin({
            filename: "quino/style/style.css",
            allChunks: true
        }),
        new HtmlWebpackPlugin({
            template: "src/index.html",
            filename: "index.html"
        }),
        new CopyWebpackPlugin([])
    ],
    optimization: {
        splitChunks: {
            cacheGroups: {
                commons: { test: /[\\/]node_modules[\\/]/, name: "vendors", chunks: "all" }
            }
        }
    }
};

package.json:

{
  "name": "MyApp",
  "version": "1.0.0",
  "sideEffects": false,
  "description": "-",
  "private": false,
  "scripts": {
    "build": "webpack --config webpack.config.js --mode production",
    "dev": "webpack-dev-server --config webpack.config.js --host 0.0.0.0 --progress --colors --history-api-fallback --mode development"
  },
  "author": "Me",
  "license": "some",
  "devDependencies": {
   .... stuff ....
  },
  "dependencies": {
    .... stuff ....
    "ajv": "^6.4.0",
    .... more stuff ....
  }
}

Я понимаю, что мой собственный код передается в ES5 с помощью компилятора TypeScript (V 2.8). Но как насчет node_modules? Особенно тот, который уже поставляет версию ES5 в своей папке dist?

Если это имеет значение, мой tsconfig.json:

{
  "compilerOptions": {
    "outDir": "build/dist",
    "module": "esnext",
    "target": "es5",
    "lib": ["es6", "dom"],
    "sourceMap": true,
    "allowJs": true,
    "jsx": "react",
    "moduleResolution": "node",
    "rootDir": "src",
    "forceConsistentCasingInFileNames": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "suppressImplicitAnyIndexErrors": true,
    "noUnusedLocals": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  },
  "exclude": [
    "dist/**",
    "./*.js",
    "node_modules",
    "build",
    "scripts",
    "acceptance-tests",
    "webpack",
    "jest",
    "src/setupTests.ts"
  ]
}

Я также думал о включении Babel для понижения всех узловых модулей до ES5, но для меня это звучит излишне, особенно если учесть, что модули уже включили версии ES5.

Вопросы:

  1. Могу ли я указать, что я предпочитаю версию ES5 для папки dist для моего node_modules? Может быть, в моем webpack.config или в package.json?

  2. Как работает выбор нужных node_modules/.../dist/ папок?

1 Ответ

0 голосов
/ 12 июня 2018
  1. Могу ли я указать, что я предпочитаю версию ES5 папки dist для моих узлов node_modules? Может быть, в моем webpack.config или package.json?

Как я понимаю, нет единого способа для обработки разных ароматов (например, ES5, ESNEXT и т. Д.) Одного и того же пакета NPM. Каждый пакет имеет свой собственный способ делать вещи. Так что нет общего способа выбора вещей. Вместо этого для решения возникающих проблем нужно включить что-либо в ваш обработчик задач (Gulp, Webpack, Grunt и т. Д.).

  1. Как работает выбор правильных папок node_modules /.../ dist /?

Пакет NPM содержит package.json. В этом файле есть поле main, в котором указывается, что включать / использовать в вашем приложении или что выбирает сборщик и т. Д. Если значение main не существует, по умолчанию будет использоваться значение index.js.

Остальная часть процесса выбора зависит от пакета. Это относится также к структуре папок пакета. Некоторые используют /dist/.. для разных вкусов, другие отправляют отладочную и производственную версию в другие папки. От каждого пакета зависит, какие файлы / версии файлов используются.

Не существует стандартизированной системы, как в .net Nuget, упаковывающей структуру папки lib/....

Что я до сих пор не уверен, так это то, почему ESNEXT-версия URL-JS выбирается, когда URL-JS указывает на ее версию ES5. Работаю над этим; -)

...