Невозможно запустить приложение, просто скопировав модули узла - PullRequest
0 голосов
/ 28 сентября 2018

Я использую приложение PreactJS (так же, как ReactJS).Мы используем webapck для создания приложения.до недавнего времени разработчики могли копировать папку node_modules из исходного репозитория, и они могли запускать приложение.

Недавно мы обновили все модули узлов, и теперь каждый разработчик должен запустить команду npm install, чтобы запустить приложение.Простое копирование папки node_modules больше не работает.

Я понимаю, что это правильный способ работы, но много времени из-за ограничений со стороны моей компании, разработчики борются с получением модулей узлов из Интернета.Вот почему мы приняли этот подход.

Вот как выглядит package.json:

 "dependencies": {
    "ion-rangeslider": "^2.2.0",
    "jquery": "^3.3.1",
    "preact": "^8.3.1",
    "preact-router": "^2.6.1",
    "preact-async-route": "^2.2.1",
    "promise-polyfill": "^8.1.0",
    "redux": "^4.0.0"
  },
  "devDependencies": {
    "@babel/cli": "^7.0.0",
    "@babel/core": "^7.0.1",
    "@babel/plugin-proposal-class-properties": "^7.0.0",
    "@babel/plugin-proposal-decorators": "^7.0.0",
    "@babel/plugin-syntax-dynamic-import": "^7.0.0",
    "@babel/plugin-transform-react-jsx": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "@babel/register": "^7.0.0",
    "@babel/runtime": "^7.0.0",
    "autoprefixer": "^9.1.5",
    "babel-eslint": "^9.0.0",
    "babel-loader": "^8.0.2",
    "compression": "^1.7.3",
    "copy-webpack-plugin": "^4.5.2",
    "core-js": "^2.5.7",
    "cross-env": "^5.2.0",
    "css-loader": "^1.0.0",
    "eslint": "^5.6.0",
    "file-loader": "^2.0.0",
    "html-webpack-plugin": "^3.2.0",
    "isomorphic-fetch": "^2.2.1",
    "less": "^3.8.1",
    "less-loader": "^4.1.0",
    "mini-css-extract-plugin": "^0.4.2",
    "mkdirp": "^0.5.1",
    "ncp": "^2.0.0",
    "optimize-css-assets-webpack-plugin": "^5.0.1",
    "path": "^0.12.7",
    "postcss-loader": "^3.0.0",
    "raw-loader": "^0.5.1",
    "regexp-replace-loader": "^1.0.1",
    "source-map-loader": "^0.2.4",
    "style-loader": "^0.23.0",
    "uglifyjs-webpack-plugin": "^2.0.0",
    "url-loader": "^1.1.1",
    "webpack": "^4.19.0",
    "webpack-bundle-analyzer": "^3.0.2",
    "webpack-cli": "^3.1.0",
    "webpack-dev-server": "^3.1.8"
  }
}

Я получаю эту ошибку:

C:\MyApp\trunk\node_modules\@xtuc\long\src\long.js:24
export default function Long(low, high, unsigned) {
^^^^^^

SyntaxError: Unexpected token export
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (C:\MyApp\trunk\node_modules\@xtuc\long\index.js:1:80)

Вопросы:

  1. Как правильно решить эту проблему?
  2. Почему я должен запустить команду npm install, чтобы мое приложение работало?Должно ли работать только копирование узловых модулей?Если мое предположение неверно, что мне нужно учиться в этой ситуации.

в webpack.config, у меня есть правило, которое предписывает babel исключить node_modules.

  rules: [
            {
                test: /\.jsx?$/,
                exclude: /node_modules/,
                loader: 'babel-loader'
            }]

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Этот пакет, который вы используете, находится в формате, который не понимает node.js.Он ожидает формат commonjs, но получает более новые модули ES6 (см. Дополнительную информацию, например, https://www.sitepoint.com/understanding-es6-modules/).Обычно пакеты в NPM (которые установлены в node_modules, имеют формат commonjs, поэтому вам не нужно переносить сторонний код, а только свой собственный код.

Как ни странно, этот пакет имеет версию commonjs. Он выглядит примерно так: babel (или другой транспортер пытается прочитать каждый файл в вашем node_modules. (что не должно происходить!) Если вы поделитесьpackage.json, мы могли видеть, запущен ли какой-либо сценарий.

0 голосов
/ 28 сентября 2018
  1. Правильное решение - настроить локальное зеркало реестра NPM, возможно, с пакетом вроде verdaccio или local-npm .Вам придется настроить его один раз в локальной сети и убедиться, что у него есть доступ к Интернету.
  2. npm install может делать разные вещи в зависимости от машины, на которой он работает.Например, модуль может скомпилировать библиотеку в MacOS, но использовать связанный двоичный файл в Windows.Копирование node_modules будет последовательно работать с каждым пакетом, только если машина, сгенерировавшая node_modules, будет идентична вашей машине для разработки.Вы даже не должны проверять node_modules в вашей системе контроля версий, только package.json и, возможно, файл блокировки.
...