部署后找不到 node_modules

Posted

技术标签:

【中文标题】部署后找不到 node_modules【英文标题】:Can't find node_modules after deployment 【发布时间】:2017-06-23 20:54:44 【问题描述】:

这个标题可能有点误导,但请耐心等待。

我在 Visual Studio 2015 上制作了一个简单的 Angular2 应用程序,现在我有了 published it on Azure

在开发环境中有 node_modules 是完美的,但部署后显示错误,说找不到 node_modules。

这是我在 index.html-

中的开发环境中所指的方式
<!-- Polyfill(s) for older browsers -->
    <script src="/node_modules/core-js/client/shim.min.js"></script>
    <script src="/node_modules/zone.js/dist/zone.js"></script>
    <script src="/node_modules/reflect-metadata/Reflect.js"></script>
    <script src="/node_modules/systemjs/dist/system.src.js"></script>
    <script src="/systemjs.config.js"></script>

它也在 system.config.js-

中提及
/**
* System configuration for Angular 2 samples
* Adjust as necessary for your application needs.
*/
(function(global) 

// map tells the System loader where to look for things
var map = 
'app':                        '/app', // 'dist',

'@angular':                   '/node_modules/@angular',
'angular2-in-memory-web-api': '/node_modules/angular2-in-memory-web-api',
'rxjs':                       '/node_modules/rxjs'
;

// packages tells the System loader how to load when no filename and/or no extension
var packages = 
'app':                         main: 'main.js',  defaultExtension: 'js' ,
'rxjs':                        defaultExtension: 'js' ,
'angular2-in-memory-web-api':  main: 'index.js', defaultExtension: 'js' ,
;

var ngPackageNames = [
'common',
'compiler',
'core',
'forms',
'http',
'platform-browser',
'platform-browser-dynamic',
'router',
'router-deprecated',
'upgrade',
];

// Individual files (~300 requests):
function packIndex(pkgName) 
packages['@angular/'+pkgName] =  main: 'index.js', defaultExtension: 'js' ;


// Bundled (~40 requests):
function packUmd(pkgName) 
packages['@angular/'+pkgName] =  main: '/bundles/' + pkgName + '.umd.js', defaultExtension: 'js' ;


// Most environments should use UMD; some (Karma) need the individual index files
var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;

// Add package entries for angular packages
ngPackageNames.forEach(setPackageConfig);

// No umd for router yet
packages['@angular/router'] =  main: 'index.js', defaultExtension: 'js' ;

var config = 
map: map,
packages: packages
;

System.config(config);

)(this);

这个错误是有道理的,因为我有一个 .gitignore 文件,它不允许 node_modules 部署到服务器。

有人可以协助我在部署后如何运行它,以及可以对上述参考进行哪些更改以使其正常工作。

【问题讨论】:

【参考方案1】:

我没有使用过 SystemJS,但你的赏金已经诱使我尝试回答,因为看起来你仍然需要答案。 :)

浏览了一些 SystemJS 文档后,您的 index.html 看起来需要在开发和生产用途中有所不同。这是development 的文档显示的内容:

<script src="systemjs/dist/system.js"></script>
<script>
  SystemJS.import('/js/main.js');
</script>

这就是他们为production 显示的内容(注意第一行有一个不同的src 路径):

<script src="systemjs/dist/system-production.js"></script>
<script>
  SystemJS.import('/js/main.js');
</script>

更重要的是,请注意node_modules 在这两种情况下都没有被引用,也不应该被引用。如果您的代码和配置设置正确,SystemJS(与其他构建工具一样)将打包您需要的所有内容,而无需任何额外的&lt;script&gt; 标签。相反,您应该从您的代码中的某个地方导入您的 shims(和类似的)。例如,在他们的 Webpack 指南(Webpack 是另一个构建工具,其作用与 SystemJS 相似)中,Angular 团队展示了一个 polyfills.ts 文件,该文件导入了他们的 shim,然后他们将 polyfills 文件包含在他们的 webpack configuration 中的构建中。

很抱歉,我无法特别针对 SystemJS 提供更具体的建议,但希望这个答案足以为您指明正确的方向。

【讨论】:

【参考方案2】:

您要么必须将node_modules 部署为包的一部分,要么让脚本运行npm install 以便您从package.json 获取包

要获取 package.json 文件中的包,请执行 npm install --save package-you-want-to-install

然后您可以通过尝试此链接https://github.com/woloski/nodeonazure-blog/blob/master/articles/startup-task-to-run-npm-in-azure.markdown上的脚本来从包 json 安装您的启动脚本

【讨论】:

感谢您的链接。但我无法理解如何运行链接中的命令。【参考方案3】:

您可以做的一件事是通过 Kudu 仪表板在 Azure 服务器上安装所需的包。

    转到https://yoursitename.scm.azurewebsites.net 然后调试控制台-> CMD 进入 home\site\wwwroot 目录 键入 npm install

这将为 Angular 2 应用程序安装所需的包以在 Azure 服务器上运行。

【讨论】:

【参考方案4】:

不要使用 system.config.js

您需要先捆绑它。不要在 Azure 中上传 node_modules。捆绑参考下面的链接。

How to bundle an Angular app for production

一旦你捆绑 dist 文件夹就会创建。您可以在 Azure 中上传 dist 文件夹。

【讨论】:

我尝试运行npm run bundle,但遇到missing script 捆绑错误。 错误是什么?您是否按照上面的链接捆绑它? @rajm 是对的,您不应该上传 node_modules,而是将所有内容捆绑在 .js 脚本中。关于missing script,这仅表示您尚未在package.json 文件中配置名称为bundle 的命令。这个怎么样:***.com/questions/35539622/…?【参考方案5】:

npm 在 prod env 上安装你的 deps ..

npm i --production

【讨论】:

在运行它时,我在控制台上得到了一些typing install,然后执行停止。

以上是关于部署后找不到 node_modules的主要内容,如果未能解决你的问题,请参考以下文章

部署到 Azure Web App 后找不到 webjob?

部署后找不到 jdbc mysql 驱动程序

Symfony 4 部署后找不到翻译文件

部署到 Azure 应用服务后找不到我的 repo 文件

关于webpack webpack-cli全局安装后找不到webpack命令的解决方案

安卓13系统升级后找不到插件