如何将文本作为 npm 脚本命令添加到文件中

How to prepend text to a file as an npm script command

我正在写一个小书签。我需要将 "javascript:" 添加到已编译、缩小的 JavaScript 之前。我正在寻找一种使用 NPM package.json 脚本来完成此操作的方法。

{ 
    "scripts": {
        "oar:transpile-typescript": "tsc --target es6  --lib dom,es6 ./OarBookmarklet/Oar.ts",
        "oar:minify-javascript": "jsmin -o ./OarBookmarklet/oar.min.js ./OarBookmarklet/oar.js",
        "oar:prepend-javascript": "[??? prepend `javascript:` to minified JavaScript ???]",
        "oar": "run-s oar:transpile-typescript oar:minify-javascript oar:prepend-javascript",
        "build": "run-s oar"
    }
}

如果这是 运行 在类 Unix 上,那么:

(printf 'javascript:' ; cat ./OarBookmarklet/oar.min.js) > ./OarBookmarklet/oar.bm.min.js

应该完成这项工作。


根据 OP 的评论进行编辑

My execution environment is Windows, ...

在这种情况下,您应该可以使用:

(set /p junk="javascript:" <nul & type ./OarBookmarklet/oar.min.js) > ./OarBookmarklet/oar.bm.min.js

set /p ... <nul 奇怪的是一种将一些文本发送到 stdout 而没有附加换行符的方法。

对于跨平台解决方案,使用 node.js 并且它是内置的 fs.readFileSync(...) and fs.writeFileSync(...)。这样,您的 npm 脚本在 shell 中运行并不重要(shcmd.exebashbash.exepwsh... )

要实现这一点,请考虑以下两种解决方案之一 - 它们本质上相同,只是应用方法不同。


解决方案 A. 使用单独的 node.js 脚本

创建以下脚本,让我们将其另存为prepend.js在项目目录的根目录下,即与[所在的同一级别=85=]居.

prepend.js

const fs = require('fs');
const filepath = './OarBookmarklet/oar.min.js';
const data = fs.readFileSync(filepath);
fs.writeFileSync(filepath, 'javascript:' + data);

package.json

package.json中定义oar:prepend-javascriptnpm脚本如下::

"scripts": {
  ...
  "oar:prepend-javascript": "node prepend",
  ...
},

注意: 以上node.js 调用脚本并执行所需的任务。如果您选择将 prepend.js 保存在不同于上述目录的目录中,请确保您定义了正确的路径,即 "oar:prepend-javascript": "node ./some/other/path/to/prepend.js"


解决方案 B. 在 package.json

中内联 node.js 脚本

或者,您可以在您的 npm 脚本中内联 prepend.js 的内容,从而避免使用单独的 .js 文件。

package.json

package.json中定义oar:prepend-javascript脚本如下:

"scripts": {
  ...
  "oar:prepend-javascript": "node -e \"const fs = require('fs'); const fp = './OarBookmarklet/oar.min.js'; const d = fs.readFileSync(fp); fs.writeFileSync(fp, 'javascript:' + d);\""
  ...
},

注:这里使用nodejs命令行选项-e来计算内联JavaScript.