代码之家  ›  专栏  ›  技术社区  ›  OpenStack

无法仅通过复制节点模块来运行应用程序

  •  0
  • OpenStack  · 技术社区  · 6 年前

    我正在运行一个PreactJS(与ReactJS相同)应用程序。我们使用webapck来构建应用程序。直到最近,开发人员才能够从源存储库复制node\u modules文件夹,并运行应用程序。

    最近我们更新了所有节点模块,现在每个开发人员都必须运行 npm install 命令以运行应用程序。简单地复制node\u modules文件夹不再有效。

    我知道这是正确的工作方式,但由于我所在公司的限制,开发人员很难从互联网上获取节点模块。这就是我们采取这种做法的原因。

     "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. 解决这个问题的正确方法是什么?

    在webpack.config中,我有一个规则告诉babel排除node\u模块。

      rules: [
                {
                    test: /\.jsx?$/,
                    exclude: /node_modules/,
                    loader: 'babel-loader'
                }]
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   axm__    6 年前

    您正在使用的一个包的格式是node.js无法理解的。它在期待 commonjs 格式,但它正在获取较新的ES6模块(请参阅以获取更多信息,例如 https://www.sitepoint.com/understanding-es6-modules/ ). 通常在NPM上安装软件包(安装到 node_modules commonjs公司 格式化,这样您就不需要传输第三方代码,而只需要传输您自己的代码。

    that package 有一个通用的js版本。看起来像是 babel package.json ,我们可以查看是否触发了任何脚本。

        2
  •  1
  •   Ari Lotter    6 年前
    1. 正确的解决方案是为NPM的注册表设置一个本地镜像,可能使用类似 verdaccio local-npm . 您必须在本地网络上设置一次,并确保它可以访问internet。
    2. npm install 可能会做不同的事情取决于它运行的机器。例如,模块可能在MacOS上编译库,但在Windows上使用绑定的二进制文件。复制 node_modules 节点\u模块 节点\u模块 检查了你的源代码管理系统,只是 package.json 也许还有锁文件。