【问题标题】:Not able to run the application just by copying node modules仅通过复制节点模块无法运行应用程序
【发布时间】:2019-03-04 19:19:51
【问题描述】:

我正在运行一个 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'
            }]

【问题讨论】:

    标签: javascript node.js webpack npm-install node-modules


    【解决方案1】:

    您正在使用的那个包的格式是 node.js 无法理解的。它期待 commonjs 格式,但它正在获取更新的 ES6 模块(参见更多信息,例如 https://www.sitepoint.com/understanding-es6-modules/ )。通常 NPM 上的包(安装到您的 node_modulescommonjs 格式,因此您不需要转译第三方代码,只需要转译您自己的代码。

    奇怪的是,that package 有一个 commonjs 版本。它看起来像babel (或另一个转译器正在尝试读取您的node_modules 中的每个文件。(这不应该发生!)如果您分享您的package.json,我们可以查看是否触发了任何脚本。

    【讨论】:

    • 我已更新问题以包含我在应用程序中使用的节点模块列表。你刚才说的很有道理。但是你是怎么得出这个结论的That one package you are consuming is in a format that node.js does not understand
    • 一遇到“import”或“export”就知道它不是commonjs。像 babel 这样的转译器负责将“import/exports”转译为“require / module.exports”。有关格式的更多信息,请参阅2ality.com/2015/12/babel-commonjs.html。您还可以添加 webpack.config.js 吗?我很确定它是 babel 不排除 node_modules 文件夹。从您的 package.json 我看不到被调用的内容,因为它不完整。它缺少左大括号和诸如包名和最重要的脚本之类的东西。
    • nodejs 在你的例子中窒息这部分:export default function Long(low, high, unsigned) { ^^^^^^ SyntaxError: Unexpected token export
    • 我确实在 webpack.config 中看到了这个 sn-p `rules: [ { test: /\.jsx?$/, exclude: /node_modules/, loader: 'babel-loader' },`哪个告诉 babel 排除节点模块?它是不起作用还是仅排除.jsx 文件
    【解决方案2】:
    1. 正确的解决方案是设置 NPM 注册表的本地镜像,可能使用像 verdacciolocal-npm 这样的包。您必须在本地网络上设置一次,并确保它可以访问互联网。
    2. npm install 可能会根据运行它的机器做不同的事情。例如,一个模块可能在 MacOS 上编译一个库,但在 Windows 上使用捆绑的二进制文件。如果生成 node_modules 的机器与您的开发机器相同,则复制 node_modules 只会始终适用于每个包。您甚至不应该将node_modules 签入您的源代码控制系统,只需将package.json 和锁定文件签入即可。

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 2011-02-03
      • 1970-01-01
      相关资源
      最近更新 更多