如何包含位于node_modules文件夹内的脚本?
我有一个关于将node_modules包含到HTML网站的最佳实践的问题。 想象一下,我有我的node_modules文件夹中的Bootstrap。 现在对于网站的分发版本(实时版本),我将如何包含位于node_modules文件夹内的Bootstrap脚本和CSS文件? 将Bootstrap放在该文件夹中并执行诸如<script src="./node_modules/bootstrap/dist/bootstrap.min.js"></script>
?是否有意义? 或者,我将不得不添加规则到我的吞噬文件,然后将这些文件复制到我的dist文件夹? 或者,最好是让吞噬完全从我的HTML文件中删除本地引导,并将其replace为CDN版本?
通常,你不想公开你的内部path来了解你的服务器是如何构build到外部世界的。 你可以在你的服务器上创build一个静态路由,从它所在的目录中获取它的文件。所以,如果你的文件在"./node_modules/bootstrap/dist/"
。 然后,页面中的脚本标签看起来像这样:
<script src="/scripts/bootstrap.min.js"></script>
如果你使用express和nodejs,静态路由就像这样简单:
app.use('/scripts', express.static(__dirname + '/node_modules/bootstrap/dist/'));
然后,来自/scripts/xxx.js
任何浏览器请求将自动从您的dist
目录中获取。
注意:较新版本的NPM在顶层放置了更多的东西,而不是嵌套如此之深,所以如果您使用的是新版本的NPM,那么path名称将与OP的问题和当前答案中所示的不同。 但是,这个概念还是一样的。 您可以找出文件位于服务器驱动器上的物理位置,然后使用express.static()
创buildapp.use()
express.static()
来为这些文件创build一个伪path,以便您不将实际的服务器文件系统组织客户端。
如果你不想这样做一个静态路由,那么你最好把公共脚本复制到一个你的Web服务器认为是/scripts
或者你想要使用的顶级名称的path上。 通常,你可以使这个复制部分的构build/部署过程。
我会使用pathnpm模块,然后做这样的事情:
var path = require('path'); app.use('/scripts', express.static(path.join(__dirname, 'node_modules/bootstrap/dist')));
正如jfriend00提到的,你不应该暴露你的服务器结构。 你可以复制你的项目依赖文件到public/scripts
。 你可以很容易地使用dep-linker这样做:
var DepLinker = require('dep-linker'); DepLinker.copyDependenciesTo('./public/scripts') // Done
目录“node_modules”可能不在当前目录中,所以你应该dynamic地parsingpath。
var bootstrap_dir = require.resolve('bootstrap') .match(/.*\/node_modules\/[^/]+\//)[0]; app.use('/scripts', express.static(bootstrap_dir + 'dist/'));
我想用更简单的解决scheme来更新这个问题。 创build一个到node_modules的符号链接。
授予公共访问node_modules最简单的方法是创build一个指向您的公共目录中的node_modules的符号链接。 符号链接将使得文件就像创build链接的任何地方一样。
例如,如果节点服务器有用于提供静态文件的代码
app.use(serveStatic(path.join(__dirname, 'dist')));
而__dirname是指/path/到/应用程序,以便您的静态文件从/path/到/ app / dist
并且node_modules在/ path / to / app / node_modules,然后在mac / linux上创build这样的符号链接:
ln -s /path/to/app/node_modules /path/to/app/dist/node_modules
或者像这样在Windows上:
mklink /path/to/app/node_modules /path/to/app/dist/node_modules
现在得到一个请求:
node_modules/some/path
将收到文件的答复
/path/to/app/dist/node_modules/some/path
这是真正的文件在
/path/to/app/node_modules/some/path
如果/ path / to / app / dist中的目录不是一个安全的位置,可能是因为构build过程中有大量的grup或grunt干扰,那么可以为链接添加一个单独的目录并添加一个新的serveStatic调用,如:
ln -s /path/to/app/node_modules /path/to/app/newDirectoryName/node_modules
并在节点中添加:
app.use(serveStatic(path.join(__dirname, 'newDirectoryName')));
我没有find任何干净的解决scheme(我不想公开所有我的node_modules的来源),所以我只是写了一个Powershell脚本来复制它们:
$deps = "leaflet", "leaflet-search", "material-components-web" foreach ($dep in $deps) { Copy-Item "node_modules/$dep/dist" "static/$dep" -Recurse }
我做了以下更改为AUTO-INCLUDE索引html中的文件。 因此,当您在文件夹中添加文件时,将自动从文件夹中选取文件,而不必将文件包含在index.html中
//// THIS WORKS FOR ME ///// in app.js or server.js var app = express(); app.use("/", express.static(__dirname)); var fs = require("fs"), function getFiles (dir, files_){ files_ = files_ || []; var files = fs.readdirSync(dir); for (var i in files){ var name = dir + '/' + files[i]; if (fs.statSync(name).isDirectory()){ getFiles(name, files_); } else { files_.push(name); } } return files_; } //// send the files in js folder as variable/array ejs = require('ejs'); res.render('index', { 'something':'something'........... jsfiles: jsfiles, }); ///-------------------------------------------------- ///////// in views/index.ejs --- the below code will list the files in index.ejs <% for(var i=0; i < jsfiles.length; i++) { %> <script src="<%= jsfiles[i] %>"></script> <% } %>
在我的Angular 2应用程序中,我在我的Index.html文件中有这个:
<script src="node_modules/jquery/dist/jquery.min.js"></script> <script src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
这是完整的文件:
<!DOCTYPE html> <html> <head> <base href="/" /> <title>TripMate - PPS</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="styles.css"> <link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css" /> <!-- 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="node_modules/jquery/dist/jquery.min.js"></script> <script src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script> <script src="systemjs.config.js"></script> <script> System.import('app').catch(function(err) { console.error(err); }); </script> </head> <body> <my-app>Loading...</my-app> </body> </html>