前端面试 -- JS开发环境和运行环境
在前端面试 – JS-Web-API部分,我们了解到了JS的一些跟DOM和BOM相关的API,但是作为一名专业的前端开发人员,还必须对前端的开发环境和运行环境有一定的了解,这不就巧了吗,本篇文章正是为大家讲述这部分内容的。
这本身就是一个面试的问题
知识点
// util.js
function getFormatDate(date, type) {
// type === 1 返回格式 2022-10-16
// type === 2 返回格式 2022年10月16日
// ...
}
// a-util.js
function aGetFormatDate(date) {
// 要求返回格式:2022年10月16日
return getFormatDate(date, 2);
}
// a.js
let date = new Date;
console.log(aGetFormatDate(date));
使用 <!-- 不使用模块化的情况 -->
<script src="util.js"></script>
<script src="a-util.js"></script>
<script src="a.js"></script>
<!-- 1、这些代码中的函数必须是全局变量,才能暴露给使用方。全局变量污染 -->
<!-- 2、a.js 知道要引用 a-util.js,但是它知道还需要依赖于 util.js吗? -->
// util.js
export {
getFormatDate(date, type) {
// type === 1 返回格式 2022-10-16
// type === 2 返回格式 2022年10月16日
// ...
}
}
// a-util.js
let getFormatDate = require('util.js');
export {
aGetFormatDate(date) {
// 要求返回格式:2022年10月16日
return getFormatDate(date, 2);
}
}
// a.js
let aGetFormatDate = require('a-util.js');
let date = new Date;
console.log(aGetFormatDate(date));
// 直接`<script src='a.js'></script>`,其他的根据依赖关系自动引用
// 那两个函数没必要做成全局变量,不会造成污染和覆盖问题
AMD全称是 Asynchronous Module Definition,即异步模块加载机制。完整描述了模块的定义,依赖关系,引用关系以及加载机制。该规范已被requireJS,nodeJS,Dojo,JQuery使用,可以看出它具有很大的价值。
// util.js
define(function() {
let util = {
getFormatDate: function(date, type) {
if(type === 1) {
return '2022-10-15';
}
if(type === 2) {
return '2022年10月15日';
}
}
}
return util;
});
// a-util.js
define(['./util.js'], function(util) {
let aUtil = {
aGetFormatDate: function(date) {
return util.getFormatDate(date, 2);
}
}
return aUtil;
});
// a.js
define(['./a-util.js'], function(aUtil) {
let a = {
printDate: function(date) {
console.log(aUtil.aGetFormatDate(date));
}
}
return a;
});
// main.js
require(['./a.js'], function(a) {
let date = new Date();
a.printDate(date);
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>7-1-amd</title>
</head>
<body>
<p>AMD test</p>
<script data-main="./main.js" src="https://cdn.bootcss.com/require.js/2.3.3/require.min.js"></script>
<!-- <script src="./main.js"></script> -->
</body>
</html>
// util.js
modules.exports {
getFormatDate(date, type) {
if(type === 1) {
return '2022-10-15';
}
if(type === 2) {
return '2022年10月15日';
}
}
}
// a-util.js
let util = require('util.js');
modules.exports {
aGetFormatDate(date) {
// 要求返回格式:2022年10月16日
return util.getFormatDate(date, 2);
}
}
知识点
npm i http-server –g // 安装 http-server 依赖
http-server -p 8881 // 在端口8881启动http服务

注意: 该http服务是轻量级的,只能用于浏览静态页面,不可将其当做nodeJS服务器端使用
npm init // 初始化npm环境
npm i webpack --save-dev // 安装webpack到开发环境

{
"name": "webpack-test",
"version": "1.0.0",
"description": "webpack test",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "wmydmu@163.com",
"license": "ISC",
"devDependencies": {
"webpack": "^5.74.0"
}
}
var path = require('path')
var webpack = require('webpack');
module.exports = {
context: path.resolve(__dirname, './src'), // 入口文件路径
entry: {
app: './app.js' // 入口文件
},
output: {
path: path.resolve(__dirname, './dist'), // 输出文件路径
filename: 'bundle.js' // 输出文件
}
}
"start": "webpack"
"dependencies": {
"jquery": "^3.6.1"
}
var $ = require('jquery');
console.log($);
var $root = $('#root');
$root.html('<p>这是jquery插入的文字</p>');

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p>test</p>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" type="text/css" href="test.css">
</head>
<body>
<div>test</div>
</body>
</html>
test.css div {
width: 100%;
height: 100px;
font-size: 50px;
}
思考:为何要把 css 放在 head 中? <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p>test</p>
<div id="container">default</div>
<script src="index.js"></script>
</body>
</html>
index.js document.getElementById('container').innerHTML = 'update by js';
思考:为何要把 js 放在 body 最下面? <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p>test</p>
<!-- 假设 test.png 很大,需要很长时间才能加载出来 -->
<p><img src="test.png"></p>
<p>test</p>
</body>
</html>
window.onload 和 DOMContentLoaded的区别 window.addEventListener('load', () => {
// 页面的全部资源加载完才会执行,包括图片、视频等
});
document.addEventListener('DOMContentLoaded', () => {
// DOM 渲染完即可执行,此时图片、视频还可能没有加载完
});
<script src="a.js"></script>
<script src="b.js"></script>
<script src="c.js"></script>
<!-- 将以上三个文件合并成一个 -->
<script src="abc.js"></script>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css">
<script src="https://cdn.bootcss.com/zepto/1.0rc1/zepto.min.js"></script>
<!-- 先加载比较小的 preview.png, 然后再异步加载真实的、比较大的 abc.png -->
<img id="img1" src="preview.png" data-realsrc="abc.png">
<script>
let img1 = document.getElementById('img1');
img1.src = img1.getAttribute('data-realsrc');
</script>
// 未缓存 DOM 查询
for (let i = 0; i < document.getElementsByTagName('p').length; i++) {
// todo
}
// 缓存了 DOM 查询
let pList = document.getElementsByTagName('p');
for(let i = 0; i < pList.length; i++) {
// todo
}
let listNode = document.getElementById('list');
// 要插入 10个 li 标签
let frag = document.createDocumentFragment();
for(let i = 0; i < 10; i++) {
let li = document.createElement('li');
li.innerHTML = "List Item" + i;
// frag 不涉及DOM操作
frag.appendChild(li);
}
listNode.appendChild(frag);
let textarea = document.getElementById('text');
let timeoutId;
textarea.addEventListener('keyup', () => {
if(timeoutId) {
clearTimeout(timeoutId);
}
// 如果打字足够快,就不会一直触发 change 事件
timeoutId = setTimeout(() => {
// 触发 change 事件
}, 100);
});
window.addEventListener('load', () => {
// 页面的全部资源加载完才会执行,包括图片、视频等
});
document.addEventListener('DOMContentLoaded', () => {
// DOM 渲染完即可执行,此时图片、视频还可能没有加载完
});
综合性的问题:应用场景的前端安全问题有哪些
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub