【问题标题】:Generate a package.json from a Node script, reading dependencies从 Node 脚本生成 package.json,读取依赖项
【发布时间】:2019-09-01 03:10:41
【问题描述】:

我的团队在过去几年中开发了大约 300 个中小型 Node 应用程序,我正在努力清理和组织这些应用程序。可以说,我心爱的助手并不总是将--save 标志与npm install 一起使用,因此package.json 文件通常不会反映所有的依赖关系。其他时候,它们包含实际未使用的包,因为有人确实使用了--save,然后改变了需要这些包的想法。

这些应用程序都使用相同的文件名约定,因此我们至少应该对此表示感谢。

我可以编写一个脚本,将源代码作为文本文件读取,使用正则表达式查找require 和import,并获取包名称。我可以自己处理版本控制。但这似乎不优雅且效率低下。

当我在一个项目上运行webpack 时,我注意到编译器会处理代码,检测任何非法语法,更重要的是,任何导入的包由于未安装而无法使用。

通常我会对执行未知脚本的过程感到恼火,但由于这些都是由已知实体编写的脚本,所以我不担心渎职。我主要不清楚像webpack 这样的程序是如何解析.js 文件而不必执行它,并返回带有行号的特定错误。

我什至不需要自动化将缺少的依赖项添加到package.json 文件的过程——300 个应用程序中的许多应用程序都是正确构建的。但它仍然可以为我节省大量时间来快速检测丢失的内容。

运行脚本以查看它是否工作涉及 VM 吗?还是像从另一个脚本运行脚本一样简单?当然,这些应用程序本身不是包,所以仅仅尝试require 他们似乎行不通。也许它使用 JSLint?

【问题讨论】:

    标签: node.js npm webpack package.json


    【解决方案1】:

    Webpack 不会运行任何脚本来运行您的代码以确保其正常工作。它使用 Babel,它是一个转译器(也不会运行您的代码)。

    编译器的工作方式是扫描您的代码并确保所有内容在语法上都是正确的,例如匹配括号或大括号,您使用的变量是否已声明,以及在静态类型语言中,您的类型是否正确。在他们这样做的同时/之后,他们会吐出目标系统可以使用的代码。对于 C 语言,编译器会根据您指定的选项将您的 C 代码转换为机器代码或程序集。

    编译器和转译器之间的区别通常是编译器向下翻译代码(朝向机器级别),而转译器水平翻译代码。想想 Typescript -> Javascript,或者在这种情况下,ES6+ Javascript -> ES[compatible] Javascript。这意味着,为了让 Babel 将您的 ES6 代码转换为更兼容的代码,它必须读取您的所有文件并执行基本的完整性检查。具体来说,如果它看到您导入代码,它将尝试访问模块/文件,因为这就是指令。如果不能,那么它会抛出一个错误。

    这也是为什么您会看到编译错误而不是运行时错误的原因,类似于其他语言。如果 Babel 真正运行你的代码来检查错误,它也可以找到运行时错误。然而,代码有许多执行分支,因此找到这些分支并设置条件以使其执行是一项艰巨的任务。这就是我们有测试工具的原因。


    要更直接地解决您的问题/疑虑:

    运行脚本以查看它是否工作涉及 VM 吗?

    没有

    还是像从另一个脚本运行脚本一样简单?

    没有

    我主要不清楚像 webpack 这样的程序是如何解析 .js 文件而不必执行它,并返回带有行号的特定错误。

    它使用 Babel,并且

    但这似乎不优雅且效率低下。

    不幸的是,这基本上就是 Babel 所做的。


    注意

    我仔细检查了 Webpack 文档,发现它们确实有自己的转译器,但它只处理导入/导出语句,并建议使用 Babel 或 Bublé 等其他转译器来转译其余部分,这就是我的意思参考 Webpack 如何使用 Babel。

    见getting started。

    【讨论】:

    • 这解释得非常优雅——谢谢!我真的很感激牵手。
    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多